Basis Data (soal beserta jawaban "select di dalam select")

TABEL DAFTAR PENYEWA:







TABEL TIPE KOMIK:













TABEL TRANSAKSI:







BASISDATA
SOAL DAN JAWABAN

1. Tampilkan ID komik yg harganya sama dengan GOTH
Jwb :
SELECT id_komik FROM ttipekomik WHERE harga_komik = ANY (SELECT harga_komik FROM ttipekomik WHERE judul_komik = 'goth');
Output:







2. Tampilkan harga komik yg judulnya NARUTO
Jwb:
SELECT harga_komik FROM ttipekomik WHERE id_komik = ANY (SELECT id_komik FROM ttipekomik WHERE judul_komik = 'naruto');
Output:





3. Tampilkan judul komik yg harganya 5000
Jwb:
SELECT judul_komik FROM ttipekomik WHERE id_komik = ANY (SELECT id_komik FROM ttipekomik WHERE harga_komik = '5000');
Output:







4. Tampilkan ID yang jumlah buku yang disewa 5
SELECT id FROM ttransaksi WHERE id_komik = ANY (SELECT id_komik FROM ttransaksi WHERE jumlah_buku = '5');
Output:




5. Tampilkan jumlah buku yang id komik disewa adalah 4
Jwb:
SELECT jumlah_buku FROM ttransaksi WHERE id = ANY (SELECT id FROM ttransaksi WHERE id_komik = '4');
Output:




6. Tampilkan tanggal penyewaan buku dari SULE
Jwb:
SELECT tanggal_penyewaan FROM ttransaksi WHERE id = ANY (SELECT id FROM ttransaksi WHERE id = '11112233');
Output:





7. Tampilkan tanggal penyewaan buku dari AGUS
Jwb:
SELECT tanggal_penyewaan FROM ttransaksi WHERE id = ANY (SELECT id FROM ttransaksi WHERE id = '11222233');
Output:




8. Tampilkan tanggal penyewaan buku dari Adi
Jwb:
SELECT tanggal_penyewaan FROM ttransaksi WHERE id = ANY (SELECT id FROM ttransaksi WHERE id = '11223344');
Output:




9. Tampilkan nama yg alamatnya pondok cabe
Jwb:
SELECT nama FROM tdaftarpenyewa WHERE id = ANY (SELECT id FROM tdaftarpenyewa WHERE alamat = 'pondok cabe');
Output:





10. Tampilkan alamat dari AGUS
Jwb:
SELECT alamat FROM tdaftarpenyewa WHERE id = ANY (SELECT id FROM tdaftarpenyewa WHERE nama = 'agus');
Output:

UNIFIED MODELING LANGUAGE

Unified Modeling Language (UML) adalah notasi yang lengkap untuk membuat visualisasi model suatu sistem. Sistem berisi informasi dan fungsi, tetapi secara normal digunakan untuk memodelkan sistem komputer. Di dalam pemodelan obyek guna menyajikan sistem yang berorientasi pada objek pada orang lain, akan sangat sulit dilakukan jika pemodelan tersebut dilakukan dalam bentuk kode bahasa pemrograman. Kesulitan yang muncul adalah timbulnya ketidak jelasan dan salah interpretasi di dalam pembacaan kode pemrograman untuk pemodelan objek tersebut.

Dimulai tahun 1994, Booch, Runbaugh dan Jacobson merupakan tiga tokoh yang metodelogi-nya paling banyak dipakai mempelopori organisasi yang bertujuan menyatukan metodelogi-metodelogi berorientasi objek, organisasi tersebut dinamakan OMG (Object Modelling Group). Pada tahun 1995 OMG merealisasi draf pertama dari UML (versi 0.8) dan pada tahun 1997 UML versi 1.1 muncul dan sekarang versi terbaru dari UML adalah versi 2.0. Pada tahun 1997 Booch, Runbaugh dan Jacobson menyusun tiga buku tentang UML. Sejak saat itulah UML telah menjelma menjadi standar bahasa pemodelan untuk aplikasi berorientasi objek.
Diagram UML

UML merupakan sintak umum untuk membuat model logika dari suatu sistem dan digunakan untuk menggambarkan sistem agar dapat dipahami selama fase analisis dan desain. UML biasanya disajikan dalam bentuk diagram/gambar yang meliputi class beserta atribut dan operasinya, serta hubungan antar class yang meliputi inheritance, association dan komposisi.

Contoh diagram UML versi 2.0


Use Case Diagram

Use case diagram menggambarkan fungsionalitas yang diharapkan dari sebuah sistem, yang ditekankan adalah “apa” yang diperbuat sistem, dan bukan “bagaimana”. Sebuah use case mempresentasikan sebuah interaksi antara actor dengan sistem. Use case menggambarkan kata kerja seperti Login ke sistem, maintenance user dan sebagainya.

Class Diagram

Class adalah sebuah spesifikasi yang jika di-instansiasi akan menghasilkan sebuah objek dan merupakan inti dari pengembangan berorientasi objek. Class menggambarkan keadaan (attribute/property) suatu sistem, sekaligus menawarkan layanan untuk memanipulasi keadaan tersebut (metode/fungsi). Class diagram menggambarkan struktur dan deskripsi class, packed dan objek beserta hubungan satu sama lain seperti containment, pewarisan, asosiasi dan lainnya.

Activity Diagram

Activity diagram menggambarkan berbagai alir aktifitas dalam sebuah sistem yang sedang dirancang, bagaimana masing-masing alir berawal, decision yang mungkin terjadi dan bagaimana mereka berakhir. Activity diagram juga dapat menggambarkan proses paralel yang mungkin terjadi pada beberapa eksekusi. Activity diagram tidak menggambarkan sifat internal dari sebuah sistem dan interaksi antara beberapa sub sistem secara eksak, tetapi lebih menggambarkan proses-proses dan jalur-jalur aktivitas dari level atas secara umum.

Sequence Diagram

Sequence diagram menggambarkan interaksi antar objek di dalam dan di sekitar sistem (termasuk pengguna, display dan sebagainya) berupa message yang digambarkan terhadap waktu. Sequence diagram terdiri atas waktu dan obyek-obyek yang terkait. Sequence diagram biasa digunakan untuk menggambarkan skenario atau rangkaian langkah-langkah yang dilakukan sebagai respons dari sebuah event untuk menghasilkan output tertentu, proses dan perubahan apa saja yang terjadi secara internal dan output apa yang dihasilkan.

Deployment Diagram

Deployment diagram menunjukan tata letak sebuah system secara fisik, menampakkan bagian-bagian software yang berjalan pada bagian-bagian hardware. Bagian utama hardware/perangkat keras adalah node; yaitu nama umum untuk semuah jenis sumber komputasi. Ada 2 tipe node yang mungkin. Processor adalah node yang bisa mengeksekusi sebuah component, sedangakan device tidak.

ISTILAH DALAM BASIS DATA

ENTITAS
Entitas adalah merupakan obyek yang mewakili sesuatu dalam dunia nyata dan dapat dibedakan antara satu dengan lainnya (unique)

ATTRIBUT
Attribut adalah merupakan sifat, ciri atau karakteristik dari suatu obyek atau entitas. atribut ini identik dengan field atau kolom pada suatu tabel.

RELASI
Relasi atau dikenal sebagai relationship dalam sistem basis data adalah merupakan suatu hubungan antara entitas satu dengan entitas yang lain. Ragam relasi dalam dua sisi. Dilihat dari kedudukan dalam sistem data base dikenal sebagai relasi kuat dan relasi lemah

CARDINALITY
Kardinalitas Relasi menunjukkan jumlah maksimum entitas yang dapat berelasi dengan entitas pada himpunan entitas yang lain. Kardinalitas relasi merujuk kepada hubungan maksimum yang terjadi dari himpunan entitas yang satu ke himpunan entitas yang lain dan begitu juga sebaliknya


TUPLE
Tuple adalah Kumpulan elemen-elemen yang saling berkaitan menginformasikan tentang suatu entitas secara lengkap. Satu record mewakili satu data atau informasi.

DOMAIN
Domain adalah sekumpulan nilai yang diijinkan untuk satu atau lebih atribut.

DERAJAT
Derajat adalah Jumlah atribut dalam sebuah relasi

BASIS DATA

DDL atau Data Definiton Language adalah sebuah bahasa yang digunakan untuk mendefinisikan pendefinisian data. Terdiri dari perintah-perintah untuk membentuk, mengubah atau menghapus tabel beserta kolom-kolom dan type data penyusunnya, serta perintah-perintah untuk menetapkan hubungan dan batasan-batasan data.

5 Macam perintah DDL yang ada di Oracle :
- CREATE TABLE
Digunakan untuk membuat tabel. Syntax umumnya sebagai berikut :

CREATE TABLE [schema, ] table ( column datatype [DEFAULT expr][,...]);

Contoh pembuatan sebuah tabel adalah :

CREATE TABLE dept  (deptno NUMBER(2),  dname VARCHAR2(14),  loc    VARCHAR2(13));

- ALTER TABLE
Statemen ALTER TABLE digunakan untuk :
~ Menambahkan kolom baru
Untuk menambah kolom baru, syntax umumnya sebagai berikut :

ALTER TABLE table ADD         (column datatype [DEFAULT expr]  [, column datatype]...);

Contoh penambahan kolom pada tabel dept yang dibuat di atas adalah :

ALTER TABLE dept ADD         (job_id VARCHAR2(9));

~ Memodifikasi kolom yang sudah ada
Kita dapat memodifikasi kolom dengan mengubah tipe datanya, ukuran dan nilai defaultnya.
Sintaks dari perintah ALTER TABLE untuk memodifikasi kolom sebagai berikut :

ALTER TABLE table MODIFY      (column datatype [DEFAULT expr]  [, column datatype] ... );

Contoh :

ALTER TABLE dept MODIFY       (dname VARCHAR2(30));

Table altered.

~ Menghapus kolom
Klausa DROP COLUMN digunakan untuk menghapus kolom yang tidak diperlukan lagi pada table. Sebagai contoh untuk menghapus kolom job_id pada pada tabel dept di atas.

ALTER TABLE dept DROP COLUMN job_id;

- DROP TABLE
Digunakan untuk melakukan penghapusan tabel. Melakukan penghapusan table dengan perintah DROP, berarti mengerjakan hal berikut :
Semua data dan struktur dari table akan dihapus
Semua transaksi pending akan di-commit
Semua indeks akan dihapus
Perintah drop ini tidak bisa di-rollback
Sebagai contoh, jika kita ingin menghapus tabel dept, maka yang harus dilakukan adalah :

DROP TABLE dept;

- RENAME
Digunakan untuk merubaha nama dari suatu object (table,view,sequence atau synonim). Sebagai contoh, jika kita ingin menghapus tabel dept,maka perintah yang harus dilakukan adalah :

RENAME dept TO detail_dept;

- CREATE VIEW
View adalah tabel bayangan. Tidak menyimpan data secara fisik. Biasanya berupa hasil query dari tabel-tabel dalam sebuah database. Syntax untuk melakuakn VIEW adalah :

CREATE VIEW  AS  

Contoh : view MahasiswaPria yang diambil dari tabel Mahasiswa di mana field JenisKel = “L”. Syntax dari contoh tersebut adalah :

CREATE VIEW MahasiswaPria AS SELECT * FROM Mahasiswa WHERE jeniskel=”L”

- CREATE TRIGGER
Trigger adalah sebuah obyek dalam database yang berupa prosedur yang merespon setiap kali terdapat proses modifikasi pada tabel. Proses modifikasi berupa: Insert, Update dan delete. Syntax pembuatan Trigger:

CREATE TRIGGER  ON TABLE  FOR [DELETE] [,] [INSERT] [,] [UPDATE] AS 

Sebagai contoh adalah membuat trigger dg nama tLogUbahNilai untuk setiap penambahan / update data pada tabel Pesertakul, dilakukan penambahan data pada tabel LogHistoris.
Syntax dari contoh tersebut adalah :

CREATE TRIGGER tLogUbahNilai ON TABLE pesertakul FOR UPDATE, INSERT AS INSERT INTO LogHistoris (tanggal, proses) VALUES (getDate(), ‘Terjadi proses perubahan data nilai’)

Data Manipulation Language (DML) merupakan bahasa basis data yang berguna untuk melakukan modifikasi dan pengambilan data pada suatu basis data.

A. Penambahan data (Insert) pada sebuah tabel :
Syntax:

INSERT INTO nama_tabel(field ke-1, ….. field ke-n) VALUES(nilai_field_ke-1, …. nilai_field_ke-n);

Contoh :

INSERT INTO Mahasiswa VALUES ('5107100029','Jeffrey Hermanto','RSMJ 12','0811232425')


B. Pembaruan data (Update) pada sebuah tabel :

Syntax:

UPDATE nama_tabel SET nama_field = data_baru WHERE nama_field = data_lama;

Contoh :

 UPDATE Mahasiswa SET Telp = '7312345' WHERE Nama = 'Jeffrey Hermanto Halimsetiawan'

C. Penghapusan data (Delete) pada sebuah tabel :
Syntax:

DELETE FROM nama_tabel [ WHERE kondisi];

Contoh :

DELETE FROM Mahasiswa WHERE Nama = 'Jeffrey Hermanto'

D. Pemilihan data dari satu atau beberapa tabel :
Syntax :

SELECT [DISTINCT] select_list FROM table_source [WHERE search_condition] [GROUP BY group_by_expression] [HAVING search_condition] [ORDER BY order_expression [ASC | DESC] ]

Contoh :

SELECT * FROM Mahasiswa; SELECT * FROM Mahasiswa WHERE Nama LIKE "%rey" ORDER BY Nama DESC; SELECT Nama, Nilai, AVG(Nilai) FROM Mahasiswa GROUP BY Nama, Nilai;

Key

Key dalam Bahasa Indonesia berarti kunci, maka semakna dengan itu fungsi dari key-key yang berada pada sebuah database. Artinya setiap pintu pasti mempunyai kunci khusus untuk membukanya, begitu pula tabel dalam database. Key-key inilah yang membantu dalam pengolahan data pada sebuah tabel (insert, update, delete).

Secara global key-key dalam Oracle dapat dibagi sebagai berikut :

Primary Key



:Key yang mengindentifikasikan bahwa setiap record pastiunique. Dalam sebuah tabel hanya diperbolehkan satuprimary key, tidak lebih. Misalnya adalah tabel MURID, tidak ada murid yang memiliki NIS (Nomor Induk Siswa) yang sama dalam keadaan real, kemudian diimplementasikan dalam bentuk tabel dengan diberikanprimary key pada kolom NIS.

Foreign Key:Key yang dihasilkan dari primary key dari tabel lain sebagai bentuk referensi dari tabel lain tersebut. Misalnya adalah tabel BELAJAR, dalam proses pembelajaran dibutuhkan kelas, guru dan apa yang dipelajari alias mata pelajaran, maka diimplementasikan dalam sebuah tabel bahwa dalam tabel BELAJAR terdapatforeign key (key asing) dari tabel KELAS, GURU dan MATA_PELAJARAN. Dari definisi key ini kita dapat mengetahui istilah MASTER-DETAIL.
Alternate Key (Unique Key):Key ini sebenarnya hampir sama dengan fungsi primary key yaitu berjenis unique key. Maksudnya adalah mungkin saja primary key yang kita buat pada suatu tabel adalah merupakan autonumber (angka yang bertambah terus-menerus ketika proses insert data, sehingga tidak dimungkinkan terdapat nilai yang sama), dikarenakan tidak diperbolehkan ada dua primary keymaka dapat dibantu oleh alternate key ini sebagai penanda unique-nya sebuah record dengan record lain. Dalam sebuah tabel diperbolehkan lebih dari satu alternate key.
Non Unique Key:Key yang bisa lebih dari satu dalam sebuah tabel dan tidak mendefinisikan unique antar record di dalam table tersabut. Key ini biasa digunakan untuk membantu proses pencarian (select) data pada sebuah kolom yang sering digunakan untuk proses tersebut.Setelah mengetahui definisi “mudah” dari setiap key maka ada beberapa tips yang harus diperhatikan dalam pemberian key pada kolom-kolom dalam sebuah tabel :
  1. Pastikan sebuah tabel mempunyai primary key.
  2. Pastikan primary key tersebut mewakili unique-nya sebuah record.
  3. Ada baiknya menjadikan satu kolom saja untuk sebuah primary key sebagai autonumber mewakili beberapa kolom yang merupakan unique-nya record. Mis : tabel BELAJAR mempunyai tiga kolom sebagai primary key, yaitu : NIG, Kode_MP, dan Kelas_ID, maka ketiga kolom tersebut dapat dijadikanalternate key, dan untuk primary key-nya dibuatkan satu kolom lagi, yaitu Belajar_ID. Ini akan mempermudah jika ada tabel yang mengambil primary key pada tabel BELAJAR sebagai foreign key tabel tersebut.
  4. Jangan terlalu banyak dalam pembuatan alternate key, karena key ini akan memperlambat proses insert dan update pada tabel tersebut. Secara logika alternate key akan mengecek ke-unique-kan seluruh record dari setiap record baru yang di-insert atau perubahan data pada record. Bayangkan jika datanya cukup besar… dan banyak alternate key… !!
  5. Pilihlah dengan baik alternate key karena alternate key akan mempermudah dan mempercepat proses select jika digunakan. Maksudnyanya adalah KOLOM-KOLOM dalam alternate keytersebut yang digunakan.
  6. Gunakan Non-unique key untuk kolom yang sering digunakan dalam proses select.
  7. Gunakan penamaan key-key tersebut dengan penamaan yang baik dan mudah diidentifikasikan, seperti BELAJAR_PK (primary key tabel BELAJAR), BELAJAR#GURU_FK (foreign key pada tabel BELAJAR dari tabel GURU), dan BELAJAR_AK (alternate key tabel BELAJAR)

Kunci kandidat adalah satu attribute atau satu set minimal attribute yang mengidentifikasi secara unik suatu kejadian specific dari entity.

Satu minimal set dari attribute menyatakan secara tak langsung dimana anda tidak dapat membuang beberapa attribute dalam set tanpa merusak kepemilikan yang unik.

Jika satu kunci kandidat berisi lebih dari satu attribute maka biasanya disebut sebagai composite key (kunci campuran/gabungan).

Contoh :

File Pegawai berisi attribute seperti :

*No Induk
*No KTP
*Nama
*Tempat Lahir
*Tanggal Lahir
*Alamat
*Kota

Kunci kandidat disini adalah :

*No Induk, karena unik tidak mungkin ganda
*No KTP, karena unik juga tidak mungkin ganda
*Nama, sering dipakai sebagai kunci pencarian namun tidak dapat dikatakan kunci karena sering seseorang punya nama yang sama.
*Nama + tempat lahir + tanggal lahir, dapat dipakai sebagai kunci
*Alamat, kota (bukan kunci).

QUICKSORT

Quicksort

RONALD GEMMY DWIPUTRA, M.ARASY.MUFAKKIR, RAHMAT YULI PURWANTO

Program Studi Sarjana Teknik Informatika
Fakultas Ilmu Komputer, Universitas Pembangunan Nasional “Veteran” Jakarta
2010

Introduction
Algoritma Quick Sort
Pengenalan
Algoritma quick sort diperkenalkan pertama kali oleh C.A.R. Hoare pada tahun 1960, dan dimuat sebagai artikel di “Computer Journal 5” pada April 1962. Quick sort adalah algoritma sorting yang berdasarkan pembandingan dengan metoda divide-and-conqueror. Disebut Quick Sort, karena Algoritma quick sort mengurutkan dengan sangat cepat. Quick sort disebut juga dengan partition exchange sort, karena konsepnya membuat partisi-partisi, dan sort dilakukan per partisi.
(i) pilih x ϵ {a1, a2, …, an} sebagai elemen pivot.
(ii) pindai (scan) tabel dari kiri sampai ditemukan elemen ap ≥ x.
(iii) pindai tabel dari kanan sampai ditemukan elemen aq ≤ x
(iv) pertukarkan ap <-> aq
(v) ulangi (ii) dari posisi p + 1, dan (iii) dari posisi q – 1, sampai kedua pemindaian bertemu di tengah tabel.
Algoritma quick sort mengurutkan dengan sangat cepat, namun algoritma ini sangat komplex dan diproses secara rekursif. Sangat memungkinkan untuk menulis algoritma yang lebih cepat untuk beberapa kasus khusus, namun untuk kasus umum, sampai saat ini tidak ada yang lebih cepat dibandingkan algoritma quick sort.
Walaupun begitu algoritma quick sort tidak selalu merupakan pilihan yang terbaik. Seperti yang telah disebutkan sebelumnya, algoritma ini dilakukan secara rekursif yang berarti jika dilakukan untuk tabel yang berukuran sangat besar, walaupun cepat, dapat menghabiskan memori yang besar pula. Selain itu, algoritma ini adalah algoritma yang terlalu komplex untuk mengurutkan tabel yang berukuran kecil (hanya puluhan elemen misalnya). Selain itu algoritma quick sort mempunyai tingkat efisiensi yang buruk ketika dioperasikan pada tabel yang hampir terurut atau pada tabel yang terurut menurun.

Algoritma :
Pivot <- A[(i+j) div 2] { pivot = elemen tengah } p <- i q <- j repeat while a[p] <>= pivot }
while a[q] > pivot do
q <- q – 1 endwhile { Aq >= pivot }
if (p _ q) then
{ pertukarkan a[p] dengan a[q]}
temp <- a[p] a[p] <- a[q] a[q] <- temp { tentukan awal pemindaian berikutnya} p <- p+ 1 q <- q – 1 endif until p > q

Deklarasi :
k : integer;
Algoritma :
if (i
Partisi(a,i,j,k) { Ukuran (a) > 1}
QuickSort(a,i,k)
QuickSort(a,k+1, j)
Endif
Procedure Partisi (input/output: a : array[1..n] of integer, input i , j : integer, output q : integer)
{Membagi tabel a[i..j] menjadi subtabel a[i..q] dan a[q+1..j]. Keluaran upatabel a[i..q] dan subtabel a[q+1..j]. Sedemikian sehingga elemen tabel a[i..q] lebih kecil dari elemen tabel a[q+1..j]}
Deklarasi :
Pivot, temp : integer
Algoritma :
if (i
Partisi(a,i,j,k) { Ukuran (a) > 1}
QuickSort(a,i,k)
QuickSort(a,k+1, j)
Endif
Procedure Partisi (input/output: a : array[1..n] of integer, input i , j : integer, output q : integer)
{Membagi tabel a[i..j] menjadi subtabel a[i..q] dan a[q+1..j]. Keluaran upatabel a[i..q] dan subtabel a[q+1..j]. Sedemikian sehingga elemen tabel a[i..q] lebih kecil dari elemen tabel a[q+1..j]}
Deklarasi :
Pivot, temp : integer

Kompleksitas Algoritma Quick Sort
Kebutuhan waktu dari quicksort bergantung pada pembuatan partisi, seimbang atau tidak, yang bergantung juga pada elemen yang digunakan sebagai pivot. Dalam menghitung kompleksitas ini, perlu dilihat pula perhitungan recurrence, karena terdapat fungsi rekursif untuk penyelesaian sub-masalah.
Terdapat 3 jenis kompleksitas waktu dari quicksort:
1. Kasus terburuk (worst case), yaitu terjadi bila terbentuk partisi dengan komposisi sub-masalah antara n – 1 elemen dan 0 elemen. Dengan demikian pemanggilan fungsi secara rekursif dengan array berukuran 0 akan langsung kembali, T(0) = Θ(1), sehingga berlaku: T(n) = T(n – 1) + cn = O(n2).
2. Kasus terbaik (best case), yaitu terjadi bila terbentuk partisi dengan dengan komposisi seimbang, dengan ukuran masing-masing tidak lebih dari n/2. Sehingga didapat: T(n) = 2T(n/2) + cn = na + cn log n = O(n log n).
3. Kasus rata-rata (average case), yaitu terjadi dari perimbangan pivot antara terbaik dan terburuk, yang dalam prakteknya lebih mendekati kasus terbaik ketimbang terburuk. Sehingga didapat: Tavg(n) = O(n log n).

pivIndex = partition(x,first, last);
quicksort(x,first,(pivIndex-1));
quicksort(x,(pivIndex+1),last);
}
}
int partition(int y[], int f, int l) {
int up,down,temp;
int piv = y[f];
up = f;
down = l;
goto partLS;
do {
temp = y[up];
y[up] = y[down];
y[down] = temp;
partLS:
while (y[up] <= piv && up <> piv && down > f ) {
down–;
}
} while (down > up);
y[f] = y[down];
y[down] = piv;
return down;}


Program C++ Quicksort

#include
void tampilkan_larik(int data[], int n)
{
int i;
for (i=0;i
cout << x="data[a];" i="a;" j="c;"> x)
j=j-1;
while (data[i] < i="i+1;" tmp="data[i];" b="partisi(data," jum_data="8;">

Digital Clock


ShoutMix chat widget

Followers