Senin, 16 April 2018

Pengantar Komputasi Cloud – NoSQL Database

A.    Cloud Computing


Cloud computing adalah gabungan pemanfaatan teknologi komputer dan pengembangan berbasis internet. Cloud Computing hadir dengan memudahkan akses data dari mana saja dan kapan saja, karena dengan memanfaatkan internet dan menggunakan perangkat fixed atau mobile device menggunakan internet cloud sebagai tempat penyimpanan data, aplikasi dan lainya. Pengguna diuntungkan dengan semakin mudahnya memperoleh atau mengunduh data secara cepat dan mudah karena banyak layanan yang dibuka oleh pihak industri. Keuntungan bagi pihak industri pun tidak kalah besar dengan kemudahan yang didapat oleh pengguna, karena dengan semakin majunya teknologi cloud computing akan semakin memudahkan industri untuk memasarkan produk dan menyebarkan informasi secara meluas keseluruh penjuru dunia.

5 karakteristik dari Cloud Computing:

1.     Resource Pooling
Sumber daya komputasi (storage, CPU, memory, network bandwidth, dsb.) yang dikumpulkan oleh penyedia layanan (service provider) untuk memenuhi kebutuhan banyak pelanggan (service consumers) dengan model multi-tenant. Sumber daya komputasi ini bisa berupa sumber daya fisik ataupun virtual dan juga bisa dipakai secara dinamis oleh para pelanggan untuk mencukupi kebutuhannya.

2.     Broad Network Access
Kapabilitas layanan dari cloud provider tersedia lewat jaringan dan bisa diakses oleh berbagai jenis perangkat, seperti smartphone, tablet, laptop, workstation, dsb.

3.     Measured Service
Tersedia layanan untuk mengoptimasi dan memonitor layanan yang dipakai secara otomatis. Dengan monitoring sistem ini, kita bisa melihat berapa resources komputasi yang telah dipakai, seperti: bandwidth , storage, processing, jumlah pengguna aktif, dsb. Layanan monitoring ini sebagai bentuk transparansi antara cloud provider dan cloud consumer.

4.     Rapid Elasticity
Kapabilitas dari layanan cloud provider bisa dipakai oleh cloud consumer secara dinamis berdasarkan kebutuhan. Cloud consumer bisa menaikkan atau menurunkan kapasitas layanan. Kapasitas layanan yang disediakan ini biasanya tidak terbatas, dan service consumer bisa dengan bebas dan mudah memilih kapasitas yang diinginkan setiap saat.

5.     Self Service
Cloud Consumer bisa mengkonfigurasikan secara mandiri layanan yang ingin dipakai melalui sebuah sistem, tanpa perlu interaksi manusia dengan pihak cloud provider. Konfigurasi layanan yang dipilih ini harus tersedia segera dan saat itu juga secara otomatis.


B.    NoSQL Database

RDBMS merupakan suatu sistem khusus yang mengatur organisasi, penyimpanan, akses, keamanan dan integritas data. RDBMS merupakan sistem pengelolaan basis data yang paling banyak digunakan saat ini, meskipun terdapat berbagai macam sistem yang lain. RDBMS menyimpan informasi dalam suatu kumpulan tabel. Suatu desain RDBMS dikatakan bagus jika terdapat normalisasi basis data didalamnya.



NoSQL merupakan basis data non relasional dengan schema-free yang memunculkan pertanyaan bagaimana NoSQL dapat melakukan partisi untuk data yang berukuran besar, melakukan query, replikasi data, dan mendukung adanya konsistensi. Bagian ini berisi penjelasan empat model data NoSQL, yaitu column-oriented, document-oriented, object-oriented dan graph-oriented.

1.     Column-oriented
Penerepan column-oriented terdapat dalam Casssandra. Cassandra menggunakan distribusi multidimensional map indexed dengan sebuah key. Baris kunci yang sering digunakan dalam Cassandra adalah string dengan panjang 16-36 bytes. Setiap kolom digabungkan menjadi sebuah coloumn families. Wei Kang menerapkan beberapa konsep dalam penerapan column-oriented. Suatu kolom unit atomic dari informasi didukung oleh Cassandra yang diekspresikan dengan nama value. Super-column merupakan gabungan dari kolom dengan nama yang umum dan digunakan untuk pemodelan tipe data yang komplek. Baris secara unik mengidentifikasikan data yang terdapat dalam column dan super-column. Dalam Cassandra baris dapat dikenali dengan sebuah kunci. Column Family merupakan bagian dari suatu unit abstraksi yang berisi baris kunci yang tergabung dalam column dan super column yang memiliki struktur data yang tinggi. Keyspace merupakan level teritnggi dari unit informasi yang terdapat dalam Cassandra. Kumpulan column families sebenarnya merupakan subordinat dari satu keyspace. Pada intinya model data column-oriented memungkinkan suatu aplikasi secara bebas untuk mengembangkan bagaimana informasi disusun berdasarkan suatu desain schema.

2.     Document-oriented
Contoh penerapan model data document-oriented terdapat dalam CouchDB yang dibangun oleh IBMTM. Basis data yang memiliki model data document-oriented sangat bermanfaat untuk suatu domain yang bentuk masukannya dokumen yang tidak terstruktur seperti web pages, wikis, discussion forums, dan blogs. Data tersimpan dalam basis data CouchDB yang mencakup serangkaian dokumentasi yang berisi beberapa atribut dan nilai dengan masing-masing id yang unik dan metadata. CouchDB tidak pernah melakukan overwrite document, melainkan menambahkan dokumen baru ke basis data bila diperlukan seperti ketika terjadi proses update.

3.     Object-oriented
Basis data berorientasi objek adalah model basis data dimana informasi direpresentasikan dalam bentuk objek yang digunakan dalam pemrograman berorientasi obyek. OrientDB adalah contoh dari basis data object-oriented. Dokumen OrientDB yang ada dalam suatu cluster, dapat berupa fisik, logis atau in-memory, yang digunakan untuk menyimpan link ke dalam data. Cluster adalah cara yang sangat umum untuk mengelompokkan record, hal ini merupakan suatu konsep yang tidak ada dalam basis data relasional. Cara ini dapat mengelompokkan semua record pada jenis tertentu, atau dengan nilai-nilai tertentu. OrientDB menggunakan segmen data untuk menyimpan isi record. Segmen data mirip dengan file physical cluster yang menggunakan dua atau lebih file, yaitu satu atau beberapa file dengan ekstensi "oda" (Orient Data) dan hanya satu file dengan ekstensi "odh" (Orient data Holes).

4.     Graph-oriented
Basis data grafik (GraphDB) adalah basis data yang menggunakan struktur grafik yang berisi node, edge, dan property untuk mewakili dan menyimpan informasi. GraphDB diperlukan untuk data grafik yang berskala besar, terutama yang dipergunakan oleh para peneliti biologi jaringan dan situs jaringan sosial, seperti Facebook, dan Twitter. GraphDB memetakan secara langsung objek ke aplikasi dan lebih intuitif untuk menggambarkan data set asosiatif. Beberapa keuntungan dari GraphDB adalah Intuitive, dimengerti oleh pikiran manusia, yaitu menggambarkan entitas dan hubungan sebagai grafik masalah umum yang akrab dengan manusia; Elemental untuk ilmu komputer, yaitu grafik, terutama grafik pohon (seperti binary-tree, B+ tree, red-black tree) berfungsi sebagai struktur data dasar dalam ilmu komputer dan berbagai masalah (shortest path dan max-flow) dapat diubah dan diselesaikan dengan algoritma grafik; Ubiquitous, yaitu pemodelan ER ke model jejaring sosial selalu dikelilingi oleh grafik baik di computer ataupun dalam kenyataan.

Keunggulan lain dalam GraphDB adalah biasanya lintasan grafik digunakan sebagai pengganti operasi join yang berpengaruh dalam efisiensi query. GraphDB juga tergantung pada kurangnya schema yang kaku di mana suatu schema dapat selalu diubah dengan mudah pada grafik, karena struktur grafik sendiri cukup fleksibel untuk mewakili perubahan melalui edit edge dan properti. GraphDB juga dapat mendukung semua fitur basis data yang kuat.

Beberapa aplikasi berbasis web yang telah menerapkan penggunaan NoSQL diantaranya adalah Google dengan BigTable, Amazon dengan Dynamo, dan Facebook dengan Cassandra dan Hadoop. Dengan mengesampingkan aspek ACID, NoSQL menerapkan konsep BASE (Basically Available, Soft state, dan Eventually consistent) untuk meningkatkan availability dan partitioning data. Basically Available memastikan bahwa sistem bekerja sepanjang waktu. Soft state merupakan suatu kondisi dimana sistem tidak harus konsisten setiap saat, dan Eventually consisten yang menekanakan bahwa sistem akan menjadi konsisten beberapa waktu kemudian.

Telah banyak produk basis data NoSQL dengan berbagai keunggulannya masing-masing. Beberapa diantaranya adalah CouchDB yang memiliki nilai konkruensi dan RESTfull HTTP request, simpleDB yang memiliki kesederhanaan dan fleksibilitas dalam pemeliharaannya, dan Google BigTable yang memiliki kuota yang terbatas.

Eric Brewer menyatakan bahwa NoSQL didasarkan pada teori CAP yaitu pemilihan dua dari tiga aspek yang ada yang harus dipenuhi oleh basis data yaitu
1.     Consistency Avaibility (CA)
Berseberangan dengan Partition-Tolerance dan biasanya berhubungan dengan replikasi.
2.     Consistency Partition-Tolerance (CP)
Berseberangan dengan Avaibility dalam penyimpanan data.
3.     Avaibility Partition-Tolerance
Sistem mencapai kondisi eventual consistency melalui replikasi dan verifikasi yang konsisten dalam node yang telah terbagi - bagi.

Dalam basis data NoSQL penerapan konsep tersebut diterjemahkan dalam empat konsep dasar yaitu Non-Relational, MapReduce, Schema Free, dan Horizontal Scaling.

1)     Non-Relational
Konsep Non-Relational dalam basis data NoSQL meliputi hirarki, graf, dan basis data berorientasi obyek yang sudah terlebih dahulu ada sejak tahun 1960 sebelum akhirnya basis data relasional muncul pada tahun 1970 [13]. Penggunaan basis data non-relational kembali merebak seiring dengan bertambahnya aplikasi berbasis web yang memerlukan banyak penyimpanan data. Meskipun memiliki kelemahan pada konsistensi dan redundansi data, namun basis data non-relasional dapat menyelesaikan beberapa permasalahan terkait dengan avaibility, dan partition tolerance. Tugas pengecekan konsistensi dan redundansi data diserahkan pada sisi aplikasi, sedangkan basis data nonrelational hanya bertugas memanipulasi penyimpanan saja.

2)     MapReduce
MapReduce merupakan model pemrograman yang diadaptasi dari pemrograman fungsional yang diimplementasikan untuk mengolah dataset yang sangat besar. Tujuan dari MapReduce adalah merancang suatu abstraksi baru yang memungkinkan pengguna untuk membuat antarmuka pemrograman sederhana dan menyembunyikan detail yang rumit dari pararelisasi, fault-tolerance, distribusi data, dan load balancing dalam pustaka pemrogramannya. Hasilnya menunjukkan bahwa penerapan MapReduce dapat menyederhanakan antarmuka pemrograman yang dapat pendukung paralelisasi dan distribusi komputasi skala besar secara otomatis.
Pemrograman dengan MapReduce telah sukses diterapkan penggunaannya oleh Google untuk berbagai tujuan, salah satunya adalah Google indexing. Dalam kinerjanya, Google menerapakan ribuan mesin yang bekerja pada ratusan terabytes data dengan lokasi server yang tersebar di beberapa lokasi. Jenis arsitektur seperti ini dapat mengurangi waktu kinerja yang diperlukan. Pembangunan arsitektur Google dengan menggunakan MapReduce memerlukan waktu hanya dalam beberapa jam saja dibandingkan dengan tidak menerapkan MapReduce yang memerlukan waktu selama berbulan bulan. Penggunaan library dalam MapReduce memiliki beberapa keuntungan seperti load balancing, optimasi perangkat penyimpanan yang nantinya akan meningkatkan keefisiensian sistem dan kemudahan dalam penggunaannya. Mudahnya, MapReduce bekerja dengan membagi proses menjadi dua fase, yaitu tahap map dan tahap reduce. Seorang programmer dapat memanfaatkan dua fungsi ini bersama fungsi key-value pairs sebagai input dan output untuk mencapai semua fase.
Berikut ini merupakan contoh penggunaan fungsi Map() dan Reduce() yang diambil dari makalah Ricky Ho. Tujuan dari penggunaan MapReduce dalam kasus ini adalah menghitung jumlah distinct path diantara orang-orang yang memiliki koneksi dan akan disarankan ke orang dalam suatu situs pertemanan. Fungsi MapReduce digunakan untuk mencari 10 orang teratas yang saling terkoneksi.
Untuk fungsi Map(), sebuah Cartesian Product dikerjakan untuk semua pasangan teman. Kita juga perlu menghilangkan pasangan yang terkoneksi langsung. Oleh karena itu fungsi Map() juga harus memunculkan pasangan orang yang terkoneksi langsung. Kita perlu mengambil key space sedemikian rupa sehingga semua key dengan pasangan yang sama akan mempunyai pengurangan yang sama. Disisi lain, kita memerlukan pasangan yang berhubungan langsung sebelum pasangan yang mempunyai pemisah.
Pada Fungsi Reduce() semua key yang mencapai reducer yang sama akan diurutkan. Jadi pasangan yang terkoneksi langsung akan ada sebelum pasangan yang tidak terkoneksi. Reducer hanya perlu untuk mengecek jika pasangan pertama merupakan koneksi langsung dan jika iya, maka lanjutnya sisanya.



3)     Schema-Free
NoSQL dan RDBMS mempunyai perbedaan dalam hal penerapan skema basis data. Dalam basis data relasional, sebuah tabel didesain dengan peraturan skema yang ketat. NoSQL menyimpan data dengan aturan yang lebih longgar, artinya tidak seperti basis data yang berdasarkan SQL tradisional , NoSQL tidak memiliki tabel, kolom, primary dan foreign key, join, dan relasi. Dalam pengembangan basis data relasional, developer/database administrator harus berhati-hati dalam menentukan bagaimana tabel saling berelasi dan field yang ada didalam setiap tabel. Karena perubahan skema dalam RDBMS dapat menimbulkan masalah ketergantungan dan integritas, seperti timbulnya kolom null dan relasi kunci yang tidak cocok. Hal ini bukan masalah dalam NoSQL karena adanya penerapan schemafree. Setiap dokumen bertanggung jawab terhadap isinya sendiri, maksutnya null value dapat dihilangkan dalam beberapa baris, dan field baru dapat didefinisikan dalam setiap dokumen secara indpenden. Salah satu produk basis data NoSQL yang menerapkan fitur schema-free adalah Cassandra. Dalam Cassandra, pengembang hanya perlu mendefinisikan keyspace sebagai pertimbangan container dan contains column families. Keyspace hanya digunakan sebagai logical namespace yang dapat dimasukkan dalam configurations dan hold column families. Column families artinya sebuah nama untuk relasi data dan hirarki kolom (memungkinkan penyisipin tabel dalam kolom). Disamping itu, kita hanya perlu menambahkan data dalam tabel, menggunakan kolom, tanpa menentukan kolomnya terlebih dahulu. Dalam Cassandra kita hanya perlu mendefinisikan tabel namespace dan hirarki kolom didalamnya, memodelkan dan mendesain tabel join adalah masalah dalam basis data relasional bukan NoSQL.
Manfaat lain dalam penggunaan schema-free adalah penghematan dalam media penyimpanan. Dalam basis data relasional, setiap field yang ada dalam tabel harus mempunyai nilai, walaupun nilai itu null. Model data schema free artinya setiap baris memungkinkan memiliki nilai sebanyak yang telah didefinisikan dalam tiap fields, dan tidak perlu menggunakan nilai yang memang tidak diperlukan. Kelemahan dalam penggunaan schema free adalah memunculkan lemahnya pendefinisian struktur yang menungkinkan terjadinya penggunaan basis data yang tidak konsisten. Jika tujuan pembangunan basis data didasarkan pada konsistenti yang ketat, seperti wiki, document management systems, discussion forums, blogs, dan support management systems, basis data relasional masih merupakan pilihan yang tepat.

4)     Horizontal Scaling
Horizontal scaling memungkinkan basis data dijalankan pada beberapa server untuk meningkatkan kemampuan perangkat penyimpanan dan meningkatkan efisiensi waktu. Hal ini memerlukan kemampuan dinamis pemartisian data dalam serangkaian node (seperti storage hosts) dalam suatu cluster server. Kemampuan untuk meningkatkan kemampuan dengan menambahkan beberapa komputer sangatlah penting dilakukan untuk data yang jumlahnya banyak, karena vertical scaling dilakukan dengan meningkatkan kemampuan spesifikasi single server (misalnya penambahan prosesor, memori, dan peralatan penyimpanan) terbatas untuk dilakukan dan lebih mahal.
Horizontal scaling berarti memungkinkan dilakukannya penambahan server dalam satu jaringan dan user tidak sadar jika ada hardware yang diganti dari sisi server (transparent). Ada beberapa teknik partisi yang digunakan dalam basis data untuk melakukan horizontal scaling, salah satunya adalah consistent hashing yang digunakan dalam Cassandra dan Amazon Dynamo. Kunci dari menerapkan consistent hashing adalah membuat suatu lingkaran atau “ring”. Setiap node dalam sistem yang ditandai dengan random value dalam suatu space yang merepresentasikan posisi dari ring. Suatu kunci item ditandai dengan sebuah node untuk memperoleh posisinya pada ring, kemudian berpindah menuju node selanjutya yang sudah ditandai. Node memerankan peranan penting sebagai koordinator untuk kunci yang akan digunakan dalam route request. Kemudian, setiap node menjadi tanggung jawab dari daerah yang ada di ring diantara noder dan node dalam ring sebelumnya. Pejelasan detail mengenal Dynamo dijelaskan oleh DeCandia dkk.

Konsep utama dari penerapan NoSQL adalah bagaimana mengatasi jumlah data yang sangat besar dan ledakan data dalam aplikasi web sebagai paridigma baru dalam penerapan teknologi basis data. Permasalahan dalam RDBMS mengenai skalabilitas dan partisi data dapat diatasi dengan menggunakan NoSQL. NoSQL memiliki beberapa keunggulan seperti basis data non-relasional (meliputi hirarki, graf, dan basis data object oriented); MapReduce yang diambil dari fungsi pemrograman diterapkan untuk menghasilkan dataset yang besar; Schema-free yang memungkinkan dimana tidak terdapat tabel, kolom, kunci primer dan sekunder, join, dan relasi; Horizontal scaling yang memungkinkan basis data untuk dijalankan dibeberapa server untuk meningkatkan penyimpanan dan peningkatan waktu akses untuk mengatasi permasalahan banyaknya data. Empat model data NoSQL juga telah berhasil diinvestigasi dalam penelitian ini, yaitu column-oriented, document-oriented, object-oriented, dan graph-oriented. Sistem pembagian data dapat dilakukan dengan memenuhi dua dari tiga teori CAP.

Untuk peningkatan horizontal scaling, NoSQL mengorbankan konsistensi. Meskipun demikian NoSQL merupakan alternatif dari RDBMS dalam hal pendistribusian data, bukan penanganan masalah secara keseluruhan terutama transaksi yang tinggi. NoSQL tidak menerapkan konsistensi dan integritas data, hal ini membuat programmer harus bekerja ekstra dalam untuk mengatasinya dari sisis pemrograman.

Minggu, 01 April 2018

Pengantar Komputasi Modern (Teori Komputasi dan Implementasi)


A.     TEORI KOMPUTASI

Kalkulasi adalah prasyarat untuk komputasi. Kalkulasi melibatkan angka-angka dan kata-kata yang menyatakan proses sederhana, sedangkan komputasi menggunakan rule, bahkan bisa tanpa angka-angka. Algoritma merepresentasikan suatu komputasi.
             Teori komputasi (theory of computation) adalah cabang ilmu komputer teoritis (theoritical computer science). Teori komputasi berkaitan dengan studi bagaimana persoalan (problem) dapat diselesaikan pada sebuah model dengan menggunakan algoritma. Model tersebut dinamakan model komputasi



·       Teori komputasi dibagi lagi menjadi 3 ranting:
1.     Teori otomata (automata theory)
2.     Teori komputabilitas (computability theory)
3.     Teori kompleksitas (computational complexity theory)

·       Beberapa model komputasi:
1.     Finite State Automata (FSA)/Finite State Machine (FSM)
(bentuk tunggal: automaton, plural: automata)
2.     Push Down Automata (PDA)
3.     Mesin Turing (Turing Machine) atau TM



B.     KOMPUTASI MODERN

Komputasi modern bisa disebut sebuah konsep sistem yang menerima intruksi-intruksi dan menyimpannya dalam sebuah memory, memory disini bisa juga dari memory komputer. Oleh karena pada saat ini kita melakukan komputasi menggunakan komputer maka bisa dibilang komputer merupakan sebuah komputasi modern. Konsep ini pertama kali digagasi oleh John Von Neumann (1903-1957). Dalam kerjanya komputasi modern menghitung dan mencari solusi dari masalah yang ada, dan perhitungan yang dilakukan itu meliputi:
1.     Akurasi
2.     Kecepatan
3.     Problem Volume Besar
4.     Modelling
5.     Kompleksitas

·       Komputasi modern terbagi menjadi tiga macam, yaitu :
1.     Mobile Computing atau komputasi bergerak adalah kemajuan teknologi komputer sehingga dapat berkomunikasi menggunakan jaringan tanpa kabel dan mudah dibawa dan mudah di pindah – pindahkan. Contoh dari perangkat komputasi bergerak, seperti smartphone, GPS, dll.
2.     Grid Computing atau komputasi grid menggunakan komputer yang terpisah oleh geografis, didistribusikan dan terhubung oleh jaringan untuk menyelesaikan masalah komputasi skala besar, ada beberapa daftar yang dapat digunakan untuk mengenali sistem komputasi grid, adalah:
-        Sistem untuk koordinat sumber daya komputasi tidak dibawah kendali pusat.
-        Sistem menggunakan standart dan protocol yang terbuka.
-        Sistem mencoba mencapai kualitas pelayanan yang canggih, yang lebih baik diatas kualitas komponen individu pelayanan komputasi grid.
3.     Cloud Computing atau Komputasi cloud merupakan gaya komputasi yang terukur dinamis dan sumber daya virtual yang sering menyediakan layanan melalui internet, Komputasi cloud menggambarkan pelengkap baru, konsumsi, dan layanan IT berbasis model dalam internet dan biasanya melibatkan ketentuan dari keterukuran dinamis dan sumber daya virtual yang sering menyediakan layanan melalui internet.

·       Perbedaan diantara ketigannya adalah:
-        Komputasi Mobile menggunakan teknologi komputer yang bekerja seperti handphone, sedangkan komputasi grid dan cloud menggunakan komputer.
-        Biaya untuk tenaga komputasi mobile lebih mahal dibandingkan dengan komputasi grid dan cloud.
-        Komputasi mobile tidak membutuhkan tempat dan mudah dibawa kemana – mana, sedangkan grid dan cloud membutuhkan tempat yang khusus.
-        Untuk komputasi mobile, proses tergantung si pengguna. Komputasi grid proses tergantung pengguna mendapatkan server atau tidak, dan komputasi cloud prosesnya membutuhkan jaringan internet sebagai penghubungnya.

C.     IMPLEMENTASI KOMPUTASI

·       Bidang Matematika
Menyelesaikan sebuah masalah yang berkaitan dengan perhitungan matematis, namun dalam pengertian yang akan dibahas dalam pembahasan komputasi modern ini merupakan sebuah sistem yang akan menyelesaikan masalah matematis menggunakan komputer dengan cara menyusun algoritma yang dapat dimengerti oleh komputer yang berguna untuk menyelesaikan masalah manusia. Contoh penyusunan kode program untuk pembuatan suatu aplikasi seperti GeoGebra - Dynamic Mathematics (GeoGebra is an interactive geometry, algebra, statistics and calculus application, intended for learning and teaching mathematics and science from primary school to university level.)

·       Bidang Ekonomi
Pemrograman yang didesain khusus untuk komputasi ekonomi, dan pengembangan alat bantu dalam pendidikan komputasi ekonomi. Karena dibidang ekonomi pasti memiliki permasalahan yang harus dipecahkan oleh algoritma contohnya adalah memecahkan teori statistika untuk memecahkan permasalahan keuangan.
Salah satu contoh komputasi di bidang ekonomi adalah komputasi statistik. Komputasi statistik adalah jurusan yang mempelajari teknik pengolahan data, membuat program, dan analisis data serta teknik penyusunan sistem informasi statistik seperti penyusunan basis data, komunikasi data, sistem jaringan, dan diseminasi data statistik.




Source:
-        https://anggasaputro.wordpress.com/2016/03/15/teori-komputasi-dan-penerapannya/