<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Iskandar Rizki</title>
    <description>The latest articles on DEV Community by Iskandar Rizki (@rizki96).</description>
    <link>https://dev.to/rizki96</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F381994%2Fea39d298-1599-4482-a62c-bbbd15f8c6f5.jpeg</url>
      <title>DEV Community: Iskandar Rizki</title>
      <link>https://dev.to/rizki96</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rizki96"/>
    <language>en</language>
    <item>
      <title>Jalan menuju pemahaman yang lebih baik melalui Elixir - Pemrograman Fungsional</title>
      <dc:creator>Iskandar Rizki</dc:creator>
      <pubDate>Sun, 06 Sep 2020 15:34:16 +0000</pubDate>
      <link>https://dev.to/rizki96/pemrograman-fungsional-2bh7</link>
      <guid>https://dev.to/rizki96/pemrograman-fungsional-2bh7</guid>
      <description>&lt;p&gt;Dalam mempelajari sebuah bahasa pemrograman, salah satu hal yang penting sebagai modal untuk sukses adalah memiliki motivasi dan alasan mempelajari-nya. Pada suatu proses &lt;em&gt;interview&lt;/em&gt; saya pernah ditanya "bagaimana cara meyakinkan seorang &lt;em&gt;programmer&lt;/em&gt; untuk mempelajari pemrograman fungsional ?". Terus terang agak kewalahan juga menjawabnya. Karena tidak ada alasan pragmatis untuk meyakinkan seorang programmer untuk mempelajari pemrograman fungsional.&lt;/p&gt;

&lt;p&gt;Diantara alasan pragmatis seorang programmer mempelajari bahasa pemrograman yaitu banyak lapangan pekerjaan yang membutuhkan bahasa X, kemudian gaji programmer bahasa X paling tinggi. Dan alasan-alasan pragmatis tadi sepanjang sepengetahuan saya bekerja di Indonesia tidak banyak berlaku bagi seorang programmer fungsional, beberapa yang bekerja sebagai programmer ReactJS mungkin sebagai pengecualian. Sedangkan satu-satunya alasan yang terlintas dalam pikiran saya untuk mempelajari pemrograman fungsional adalah untuk menjadi &lt;em&gt;programmer&lt;/em&gt; yang lebih baik.&lt;/p&gt;

&lt;p&gt;Alasan untuk menjadi &lt;em&gt;programmer&lt;/em&gt; yang lebih baik akan efektif jika seorang &lt;em&gt;programmer&lt;/em&gt; telah memiliki pengalaman kurang beruntung dengan konsep &lt;a href="https://id.wikipedia.org/wiki/Pemrograman_berorientasi_objek"&gt;OOP (Object Oriented Programming)&lt;/a&gt;, atau tidak merasa puas dengan konsep OOP. Bukannya konsep OOP tidak bagus, tapi ada sesuatu yang kurang dengan OOP, walaupun konsep &lt;em&gt;design pattern&lt;/em&gt; menyempurnakannya, banyak yang mungkin tidak mengadopsinya dan tidak menjadikan &lt;em&gt;design pattern&lt;/em&gt; itu wajib diterapkan, dan mungkin ada yang merasa &lt;em&gt;design pattern&lt;/em&gt; adalah sesuatu yang &lt;em&gt;over engineered&lt;/em&gt; bagi konsep OOP. Jika ada yang merasakan hal yang sama, maka sudah waktunya untuk mencoba paradigma pemrograman lain yaitu pemrograman fungsional.&lt;/p&gt;

&lt;p&gt;Pengalaman mencoba beberapa bahasa fungsional seperti &lt;em&gt;Scala&lt;/em&gt;, &lt;em&gt;Clojure&lt;/em&gt; dan kemudian &lt;a href="https://id.wikipedia.org/wiki/Elixir_(bahasa_pemrograman)"&gt;&lt;em&gt;Elixir&lt;/em&gt;&lt;/a&gt;, membuat saya merasakan &lt;em&gt;Elixir&lt;/em&gt; adalah sebuah bahasa fungsional yang sangat &lt;em&gt;"Down to Earth"&lt;/em&gt;. Mungkin karena pencipta bahasa &lt;em&gt;Elixir&lt;/em&gt;, yaitu Jose Valim memiliki latar belakang dari komunitas &lt;em&gt;Ruby&lt;/em&gt;, dimana &lt;em&gt;Ruby&lt;/em&gt; selalu mengedepankan &lt;em&gt;"Developer Happiness"&lt;/em&gt;, sehingga banyak konsep dari Ruby diadopsi ke dalam Elixir. Elixir sendiri adalah bahasa pemrograman yang berjalan diatas &lt;a href="https://translate.google.com/translate?u=https://en.wikipedia.org/wiki/Erlang_(programming_language)&amp;amp;hl=id&amp;amp;sl=en&amp;amp;tl=id&amp;amp;client=srp&amp;amp;prev=search"&gt;Erlang VM&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Kemudian pekan lalu teman dengan latar belakang bahasa &lt;em&gt;Java&lt;/em&gt; yang menyatakan, "diantara Python, Golang dan Elixir, Elixir memiliki kurva pembelajaran (learning curve) yang paling tinggi". Hal tersebut sangat wajar sekali, karena diantara ketiga bahasa pemrograman tersebut memiliki paradigma yang berbeda. Python dengan konsep &lt;em&gt;pragmatic OOP&lt;/em&gt; dan sedikit konsep fungsionalnya, Golang dengan konsep imperativenya, dipengaruhi dari bahasa C, kedua bahasa ini secara konsep sudah sangat familiar oleh sebagian besar programmer, dan yang berbeda adalah Elixir dengan konsep murni fungsional. Dan yang perlu diingat adalah, ketika melakukan &lt;em&gt;programming&lt;/em&gt; dalam Elixir, konsep-konsep bahasa &lt;a href="https://id.wikipedia.org/wiki/Pemrograman_imperatif"&gt;imperative&lt;/a&gt; dan OOP, seperti mutable object, konsep class dengan member, inheritance dan lain sebagainya harus juga dilupakan, dan setiap sifat (&lt;em&gt;behaviour&lt;/em&gt;) dari bahasa imperative dan OOP tadi pasti ada penggantinya di Elixir. Dan saya akui bahwa dari pernyataan teman inilah yang membuat saya ingin mencoba menceritakan pengalaman dalam mempelajari Elixir.&lt;/p&gt;

&lt;p&gt;Dari pengalaman mempelajari Elixir, saya melihat paling tidak ada dua konsep besar yang berperan dalam Elixir, dan bila kedua konsep ini dikuasai, maka saya yakin akan lancar dalam penggunaan bahasa ini. Kedua konsep tadi adalah konsep bahasa fungsional dari Elixir dan konsep Actor dari Erlang VM. Kedua konsep ini saling berperan dalam menciptakan sebuah sistem dengan kehandalan (&lt;em&gt;reliability&lt;/em&gt;) yang sangat tinggi. Hal yang mencakup dalam konsep bahasa fungsional ada paling tidak tiga hal yang penting yaitu&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;immutable objects&lt;/li&gt;
&lt;li&gt;declarative programming&lt;/li&gt;
&lt;li&gt;higher order function&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pemrograman Fungsional di Elixir
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;mungkin sudah banyak yang mengenal tentang immutable objects, definisi bebasnya adalah memberlakukan seluruh nilai yang digunakan dalam proses pemrograman sebagai nilai yang tidak dapat diubah dari saat nilai tersebut dibentuk atau dideklarasikan sampai akhir masa berlakunya nilai tersebut. &lt;br&gt;
Untuk mempermudah pemahaman tentang immutable objects ini saya coba analogikan semua nilai immutable adalah &lt;em&gt;data&lt;/em&gt;. Seperti kita tahu, &lt;em&gt;data&lt;/em&gt; bersifat konstan dan merupakan fakta yang tidak berubah. Contoh data adalah "curah hujan di tanggal 5 September 2020", merupakan sebuah data yang nilainya tetap dan merupakan sebuah fakta. &lt;br&gt;
Programmer tidak bisa mengubah fakta tentang "curah hujan" di tanggal tersebut, tetapi yang bisa dilakukan adalah membuat data baru dari fakta tersebut. Dari banyak data di tanggal-tanggal bulan September, programmer dapat membuat data baru misalnya "rata-rata curah hujan di bulan September". &lt;br&gt;
Jadi demikian dianalogikan, bahwa jika seorang programmer menginginkan sebuah nilai yang dibutuhkan, programmer dapat membangun nilai baru tersebut dari kumpulan data-data atau nilai-nilai lain yang telah tersedia.&lt;br&gt;
Apa keuntungan menggunakan immutable objects ini ? Dalam concurrency programming seperti &lt;em&gt;multi-threading&lt;/em&gt; atau &lt;em&gt;multi-processing&lt;/em&gt;, seorang programmer tidak membutuhkan mutex atau mekanisme &lt;em&gt;resource locking&lt;/em&gt;, karena semua nilai yang digunakan adalah &lt;em&gt;read only&lt;/em&gt;, tiap thread bebas melakukan pembacaan pada nilai tersebut. Sehingga dengan immutability memastikan kondisi &lt;em&gt;thread-safe&lt;/em&gt; dan &lt;em&gt;memory-safe&lt;/em&gt; pada program.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;seperti namanya &lt;em&gt;declarative programming&lt;/em&gt; adalah kebalikan dari &lt;em&gt;imperative programming&lt;/em&gt;. Dimana dalam imperative programming, seorang programmer secara eksplisit menuliskan semua perintah kepada program untuk menjalankan langkah-langkah yang harus dilakukan, pada declarative programming, tidak semua langkah-langkah harus diberikan secara eksplisit dari programmer pada program, hanya bagian yang penting saja perlu dituliskan pada program, hal yang bukan bagian penting telah didelegasikan kepada fungsi lain. Untuk lebih jelasnya berikut adalah contoh dari imperative programming,&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;

Dari contoh imperative programming diatas jelas terlihat setiap langkah diberikan instruksi oleh programmer, mulai dari inisialisasi nilai total, sampai proses &lt;em&gt;looping&lt;/em&gt; diberikan secara detil langkah pengerjaannya. Bandingkan dengan declarative programming,
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;

Terlihat dari contoh diatas proses looping telah didelegasikan kepada fungsi Enum.reduce, secara implementasi programmer tidak tahu apakah looping yang dilakukan dari index terkecil atau terbesar, semua terserah implementasi fungsi Enum.reduce. Yang programmer lakukan hanya menentukan nilai inisialisasi seperti apa yang diinginkan dan apa yang harus dilakukan untuk nilai tiap item member, dimana nilai tiap item member ditambahkan dengan nilai total item sebelumnya yang disimpan dalam accumulator (acc).
Apa keuntungannya jika programmer mengadopsi declarative programming ini ? Tentu saja kode yang dihasilkan akan lebih jelas dan ringkas (&lt;em&gt;clear and concise&lt;/em&gt;), karena sebagian besar kode yang digunakan adalah fungsi yang telah dipercayakan pasti berjalan dengan baik dan benar, yang berasal dari bahasa Elixir itu sendiri maupun ekosistemnya. Dan tentu saja dapat memperkecil kecenderungan terjadinya kesalahan (&lt;em&gt;error prone&lt;/em&gt;) pada program.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;higher order function&lt;/em&gt; adalah sebuah konsep dimana setiap input dan output pada sebuah proses bukan hanya nilai tapi dapat berupa fungsi. Hal ini yang menyebabkan fungsi adalah sebuah bagian yang terpenting dari bahasa pemrograman Elixir. Contoh input output dapat berupa fungsi adalah sebagai berikut,&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;

Dapat dilihat pada contoh diatas, reduce_func merupakan sebuah pointer menuju fungsi. Dimana pointer ini dapat diberlakukan sebagai input maupun output. Pada fungsi anonim anon2 terlihat bahwa pointer fungsi reduce_func adalah output dari fungsi anon2. Pada fungsi anon2 juga terlihat bahwa anon1 merupakan input dari reduce_func. Terlihat pada bahasa Elixir pointer menuju fungsi ini dapat diberlakukan sebagai input maupun output.
Sedikit tambahan variasi penulisan pointer menuju fungsi, juga dapat berbentuk seperti dibawah,
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;

Diatas terlihat bahwa fungsi anonim anon1 dapat digantikan dengan sintaks &amp;amp;(&amp;amp;2+&amp;amp;1*&amp;amp;1), untuk meringkaskan penulisan kode, tapi sedikit mengorbankan clarity atau kejelasan dari kode. 
Dengan &lt;em&gt;higher-order function&lt;/em&gt; ini keuntungannya adalah keseluruhan program yang dibangun dari banyak fungsi-fungsi yang lebih kecil dibawahnya, sehingga dengan konsep ini dapat dibangun sebuah sistem yang memenuhi prinsip &lt;a href="https://en.wikipedia.org/wiki/Composability"&gt;&lt;em&gt;composability&lt;/em&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Selain ketiga konsep diatas, masih ada fitur-fitur bahasa Elixir yang merupakan variasi-variasi dari pemrograman fungsional, diantaranya adalah pipe operator (|&amp;gt;), konsep matching operator (=) dan pattern matching, pin operator (^), protocols, &lt;a href="https://medium.com/elixirlabs/railway-oriented-programming-in-elixir-with-pattern-matching-on-function-level-and-pipelining-e53972cede98"&gt;railway oriented programming&lt;/a&gt;, dan masih banyak lainnya.&lt;/p&gt;

&lt;p&gt;Jika dipelajari lebih lanjut, maka akan terlihat sebenarnya konsep pemrograman fungsional adalah sebuah konsep yang cukup familiar di antara programmer, tetapi hanya diperlukan pembiasaan dan menanamkan &lt;em&gt;mindset&lt;/em&gt; dari konsep-konsep pemrograman fungsional diatas. Untuk konsep pemrograman fungsional mungkin sampai disini dulu, untuk artikel yang berikutnya akan dibahas tentang pemrograman aktor di Elixir. Terima kasih.&lt;/p&gt;

</description>
      <category>erlang</category>
      <category>elixir</category>
      <category>betterprogrammer</category>
    </item>
    <item>
      <title>Web FullStack menggunakan Phoenix LiveView - Publisher Subscriber</title>
      <dc:creator>Iskandar Rizki</dc:creator>
      <pubDate>Mon, 24 Aug 2020 07:08:47 +0000</pubDate>
      <link>https://dev.to/rizki96/web-fullstack-menggunakan-phoenix-liveview-publisher-subscriber-29f2</link>
      <guid>https://dev.to/rizki96/web-fullstack-menggunakan-phoenix-liveview-publisher-subscriber-29f2</guid>
      <description>&lt;p&gt;Ini merupakan bagian akhir dari seri Web FullStack menggunakan Phoenix LiveView. Pada bagian akhir ini akan coba diimplementasikan mekanisme Publisher Subscriber, atau yang sering disebut dengan PubSub. PubSub adalah sebuah mekanisme yang bertujuan untuk saling berkomunikasinya antara proses atau dalam konteks erlang/elixir adalah actor, baik itu dalam satu host/mesin atau berlainan host. Perlu diketahui bahwa proses PubSub ini bersifat &lt;em&gt;asynchronous&lt;/em&gt;, atau semua proses publish atau subscribe tidak ada actor / proses yang harus menunggu hingga proses publish atau subscribe ini selesai dijalankan.&lt;/p&gt;

&lt;p&gt;Kemudian menjadi pertanyaan adalah untuk apa mengimplementasikan PubSub pada sebuah implementasi web aplikasi ? Untuk lebih jelas mungkin bisa melihat video ilustrasi dibawah, dimana terdapat 2 browser yang membuka halaman yang sama, perubahan di suatu halaman, dapat membuat halaman lainnya berubah pula. Bagaimana agar halaman browser lain tadi bisa ikut berubah jika terjadi perubahan pada suatu halaman dengan browser berbeda ? Salah satu caranya adalah dengan mekanisme PubSub.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/nt_90rX9Nzc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Mungkin banyak yang sudah mengenal implementasi PubSub ini menggunakan tools seperti rabbitmq, redis atau kafka. Dalam &lt;em&gt;Phoenix framework&lt;/em&gt; salah satu implementasi PubSub adalah dengan menggunakan &lt;em&gt;Distributed Erlang&lt;/em&gt;, dimana implementasi ini sudah &lt;em&gt;built-in&lt;/em&gt; di dalam Elixir, sehingga tidak perlu melakukan maintain software atau stack lainnya. Seperti apa cara kerja dari PubSub dalam &lt;em&gt;Phoenix framework&lt;/em&gt; ? Berikut adalah ilustrasinya&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dM63mNoZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ezgph7hlc3fc02voxreu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dM63mNoZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ezgph7hlc3fc02voxreu.png" width="500" alt="ilustrasi cara kerja PubSub dalam Phoenix framework"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sebagai contoh adalah ketika ada permintaan "Add Todo" yang datang ke browser, permintaan "Add Todo" ini akan dikirimkan melalui komunikasi LiveView kepada sebuah Actor. Actor ini akan memproses permintaan "Add Todo" dan hasilnya akan di publish sebagai sebuah "event" (kejadian) dalam sebuah topik. Topik ini merupakan sebuah scope atau lingkup dimana beberapa "event-event" akan dipublish. Jika tadi sudah dijelaskan bahwa ada Actor yang akan melakukan publish event dalam topik, ada pula Actor yang akan melakukan subscribe ke dalam topik, yang nantinya akan menerima "event-event" yang di publish. Actor-actor yang melakukan subscribe ini kemudian akan meneruskan "event" yang diterima dari publisher ke LiveView agar tampilan dari browser dapat diupdate sesuai dengan data yang diterima.&lt;/p&gt;

&lt;p&gt;Bagaimana mengimplementasikan PubSub ini pada halaman Todo ? Berikut kodenya yang ditambahkan pada file 'lib/liveview_todo_web/live/todo_live.ex'.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Bagian yang ditambahkan adalah kode &lt;strong&gt;Phoenix.PubSub.subscribe(LiveviewTodo.PubSub, @topic, link: true)&lt;/strong&gt; dan &lt;strong&gt;Phoenix.PubSub.broadcast(LiveviewTodo.PubSub, @topic, {"new_todo_event", new_todo})&lt;/strong&gt;. Dimana kedua fungsi ini berguna berturut-turut untuk melakukan subscribe terhadap sebuah topik (@topic yang bernilai "live_todo") dan melakukan publish yang akan mem-broadcast atau menyiarkan jika terjadi sebuah "event", pada broadcast tersebut contoh "event" adalah ketika terjadi "Add Todo" maka akan menghasilkan event "new_todo_event", dengan mengirimkan data "new_todo" ke setiap subscriber.&lt;/p&gt;

&lt;p&gt;Pada file tersebut juga ditambahkan fungsi &lt;strong&gt;handle_info({"delete_todo_event", todo} = _info, socket)&lt;/strong&gt; dan &lt;strong&gt;handle_info({_event, todo} = _info, socket)&lt;/strong&gt; dimana berturut-turut kedua fungsi tersebut adalah sebagai fungsi penampung dari event "delete_todo_event" dan sisa event lainnya yaitu "new_todo_event" dan "update_todo_event". Dan di masing-masing fungsi ini hanya terdapat 1 pemanggilan fungsi saja, berturut-turut adalah fungsi push_event dan assign. Fungsi push_event seperti yang telah dijelaskan pada &lt;a href="https://dev.to/rizki96/web-fullstack-menggunakan-phoenix-liveview-javascript-interoperability-2la2"&gt;artikel sebelumnya&lt;/a&gt;, berguna untuk mentrigger JS Interop yang akan menghapus tampilan data todo pada browser. Sedangkan fungsi assign berfungsi untuk melakukan update terdapat state LiveView yang berisi data todo, yang kemudian akan berefek mengubah halaman web LiveView yang dikendalikan oleh actor yang menerima "event" dari publisher atau broadcaster.&lt;/p&gt;

&lt;p&gt;Untuk mencoba implementasi PubSub ini, jangan lupa untuk melakukan pengecekan pada file 'lib/liveview_todo/application.ex', apakah Phoenix.PubSub sudah masuk sebagai child actor. Berikut contoh isi file 'application.ex'&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Yakinkan terdapat baris berikut pada application.ex tersebut &lt;strong&gt;{Phoenix.PubSub, name: LiveviewTodo.PubSub}&lt;/strong&gt;, baris tersebut akan menambahkan Phoenix.PubSub sebagai child actor dari aplikasi. Untuk langsung melihat kodenya, silahkan clone atau fork github repo berikut &lt;a href="https://github.com/rizki96/liveview_todo"&gt;https://github.com/rizki96/liveview_todo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sudah diterangkan pada artikel-artikel sebelumnya bagaimana dengan Elixir khususnya Phoenix framework dapat membangun suatu aplikasi web yang bersifat realtime. Dimana jika terjadi perubahan data di server, secara instan dan cepat, semua client browsernya dapat juga menerima perubahan datanya. Semua ini dapat dibangun dengan sebuah ekosistem yang lengkap secara fungsi, boleh dikatakan Erlang/Elixir adalah sebuah arsitektur yang memiliki sifat &lt;strong&gt;"One Size Fits All Architecture"&lt;/strong&gt; dimana semua kebutuhan untuk membangun aplikasi realtime dapat dipenuhi oleh ekosistemnya. Mulai dari database, websocket, pubsub, cache, queue dan lain sebagainya. Jika ada kebutuhan untuk mengadopsi solusi yang lebih handal, baru kemudian solusi itu akan diadopsi, misalnya fungsi database digantikan dengan postgresql, mysql dan lainnya.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fDryASz7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/aowydp9f81wj1e4wnld0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fDryASz7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/aowydp9f81wj1e4wnld0.png" alt='Ilustrasi Arsitektur "One Size Fits All"'&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demikian telah coba dibawakan artikel-artikel mengenai Web FullStack menggunakan Phoenix LiveView. Dimana artikel-artikel ini adalah cara saya agar dapat mempelajari lebih dalam mengenai Elixir dan ekosistemnya. Karena bagi saya banyak sekali hal yang baru dari Erlang/Elixir ini mulai dari konsep pemrograman hingga konsep arsitekturnya, sehingga lebih terbuka mengenai berbagai hal seperti functional programming, concurrencies, process communication, bahkan sedikit konsep mengenai microservice. Mudah-mudahan bisa bermanfaat juga untuk yang lainnya. Terima kasih.&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>phoenixframework</category>
      <category>phoenixliveview</category>
      <category>phoenixpubsub</category>
    </item>
    <item>
      <title>Web FullStack menggunakan Phoenix LiveView - Javascript Interoperability</title>
      <dc:creator>Iskandar Rizki</dc:creator>
      <pubDate>Sun, 16 Aug 2020 16:35:53 +0000</pubDate>
      <link>https://dev.to/rizki96/web-fullstack-menggunakan-phoenix-liveview-javascript-interoperability-2la2</link>
      <guid>https://dev.to/rizki96/web-fullstack-menggunakan-phoenix-liveview-javascript-interoperability-2la2</guid>
      <description>&lt;p&gt;Bagian ketiga dari &lt;em&gt;Web FullStack&lt;/em&gt; menggunakan &lt;em&gt;Phoenix LiveView&lt;/em&gt; akan membahas tentang Javascript Interoperability. Apa itu &lt;em&gt;Javascript Interoperability&lt;/em&gt; atau lebih dikenal dengan &lt;em&gt;JS Interop&lt;/em&gt; pada &lt;em&gt;LiveView&lt;/em&gt; ? Seperti artinya &lt;strong&gt;JS Interop&lt;/strong&gt; adalah suatu mekanisme untuk menggunakan kode &lt;em&gt;Javascript&lt;/em&gt; dalam keseluruhan siklus &lt;em&gt;LiveView&lt;/em&gt;. Seperti pada tujuan didesain-nya &lt;em&gt;LiveView&lt;/em&gt; adalah bukan meniadakan fungsi &lt;em&gt;Javascript&lt;/em&gt; pada kode yang dibangun, tetapi tujuan LiveView adalah meminimalkan penggunaan &lt;em&gt;Javascript&lt;/em&gt; pada kode &lt;em&gt;framework Phoenix&lt;/em&gt;. Pada akhirnya cepat atau lambat mekanisme &lt;em&gt;JS Interop&lt;/em&gt; ini akan digunakan pada kode &lt;em&gt;framework Phoenix&lt;/em&gt;, karena pada akhirnya kita membutuhkan solusi &lt;em&gt;custom&lt;/em&gt; ataupun solusi yang lebih &lt;em&gt;advance&lt;/em&gt; dari &lt;em&gt;Javascript&lt;/em&gt;, jika kebutuhan dari aplikasi mengharuskan hal tersebut.&lt;/p&gt;

&lt;p&gt;Untuk melihat bagaimana penggunaan &lt;em&gt;JS Interop&lt;/em&gt;, mari kita coba implementasikan fungsi hapus data sebagai bagian dari CRUD dari aplikasi &lt;em&gt;Todo&lt;/em&gt; yang telah diimplementasikan sebelumnya. Sebelum masuk ke &lt;em&gt;JS Interop&lt;/em&gt;, akan dibandingkan juga implementasi hapus ini jika &lt;strong&gt;tanpa&lt;/strong&gt; menggunakan JS Interop. Seperti biasa, untuk memudahkan dan mempercepat pemahaman, sebelumnya silahkan clone atau fork github repo berikut &lt;a href="https://github.com/rizki96/liveview_todo"&gt;https://github.com/rizki96/liveview_todo&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solusi penghapusan tanpa &lt;strong&gt;JS Interop&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Solusi tanpa &lt;strong&gt;JS Interop&lt;/strong&gt; merupakan solusi yang paling mudah untuk dilakukan. Pertama adalah tambahkan informasi pada file 'lib/liveview_todo_web/router.ex', sehingga terdapat link untuk melakukan penghapusan atau &lt;em&gt;delete&lt;/em&gt; pada &lt;strong&gt;endpoint&lt;/strong&gt; '/todo'. Berikut contoh penggalan kode dari router.ex&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Saat ini artinya module TodoLive telah memiliki endpoint :delete. Sehingga file 'lib/liveview_todo_web/live/components/todos/todo_list_item.ex' dapat ditambahkan salah satu fungsi link html untuk liveview yaitu &lt;em&gt;live_redirect&lt;/em&gt; untuk melakukan operasi penghapusan. Berikut isi file 'todo_list_item.ex' yang terbaru&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Terlihat dari fungsi &lt;em&gt;live_redirect&lt;/em&gt;, link tersebut akan membawa menuju ke &lt;em&gt;Routes.live_path(@socket, TodoLive, [id: @todo.id, action: :delete]), replace: false)&lt;/em&gt;, Routes.live_path ini merupakan representasi dari link '/todo' yang ada pada file 'router.ex', yang kemudian akan di render oleh browser sebagai '/todo?id={id}&amp;amp;action=delete'. Dan dari router live_path tersebut, client akan dibawa ke fungsi &lt;em&gt;handle_params&lt;/em&gt; pada module &lt;em&gt;TodoLive&lt;/em&gt;. Seterusnya module &lt;em&gt;TodoLive&lt;/em&gt; akan berbentuk sebagai berikut &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Maka setelah semua kode tersebut terpasang, maka penghapusan sudah bisa dilakukan. Tetapi ada hal yang perlu diingat dari kode diatas. Yaitu jika dilihat pada bagian '# versi tanpa &lt;em&gt;JS Interop&lt;/em&gt;' setelah &lt;em&gt;handle_params&lt;/em&gt; melakukan penghapusan terhadap data &lt;em&gt;todo&lt;/em&gt;, maka semua data kembali akan di &lt;em&gt;fetch&lt;/em&gt; dari database dengan fungsi &lt;em&gt;{:ok, todos} = Tasks.list_todos()&lt;/em&gt; dan &lt;em&gt;state&lt;/em&gt; dari todos akan di &lt;em&gt;assign&lt;/em&gt; ulang. Hal ini tentu akan menimbulkan &lt;em&gt;bottle neck&lt;/em&gt; jika jumlah data todo yang di &lt;em&gt;fetch&lt;/em&gt; cukup signifikan. Untuk menghindari hal tersebut, yang perlu dilakukan adalah mengganti operasi fetch data tadi dengan operasi pengiriman event ke client browser dalam hal ini ke Javascript, sehingga nanti Javascript yang akan melakukan penghapusan todo item, tanpa perlu melakukan fetch data dan mengirimkan data ke client browser. Hal tersebut akan coba dijelaskan pada bagian berikutnya yaitu solusi menggunakan &lt;em&gt;JS Interop&lt;/em&gt;. Dan berikut adalah ilustrasi pengiriman data dari server ke client dengan solusi &lt;strong&gt;tanpa&lt;/strong&gt; &lt;em&gt;JS Interop&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--udt1jPcK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2k5tfpcvm4ygiyzfbf29.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--udt1jPcK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2k5tfpcvm4ygiyzfbf29.png" width="500" alt="ilustrasi pengiriman data yang difetch dari database dengan solusi tanpa JS Interop"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Solusi penghapusan dengan &lt;strong&gt;JS Interop&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sebelumnya perlu diketahui bahwa &lt;em&gt;JS Interop&lt;/em&gt; merupakan sebuah siklus berupa fungsi callback yang terjadi pada sebuah &lt;em&gt;LiveView Component&lt;/em&gt;. Siklus tersebut terdiri dari fungsi mounted, beforeUpdate, updated, beforeDestroy, destroyed dan lainnya, untuk lebih jelas tentang siklusnya bisa dilihat pada &lt;a href="https://hexdocs.pm/phoenix_live_view/js-interop.html"&gt;link ini&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Disebabkan karena yang akan melakukan penghapusan ada pada elemen list, maka akan diimplementasikan &lt;em&gt;JS Interop&lt;/em&gt; ini pada &lt;em&gt;LiveView Component&lt;/em&gt; 'todo_list.ex' pada direktori 'lib/liveview_todo_web/live/components/todos'. Untuk memulai mari buat sebuah file javascript yang berfungsi sebagai hook, pada direktori 'assets/js' dengan nama file 'todo_list_hook.js'. Berikut isi dari file 'todo_list_hook.js'&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Kemudian lakukan modifikasi pada file 'app.js' pada direktori 'assets/js', dimana file Javascript ini yang akan dimuat (&lt;em&gt;load&lt;/em&gt;) untuk pertama kali pada client browser. Berikut isi dari file 'app.js'&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Dari kode diatas terlihat object hook TodoListHook di-import dan kemudian diteruskan ke dalam object LiveSocket. Setelah ini dibutuhkan melakukan modifikasi file berturut-turut yaitu 'todo_list.ex', 'todo_list_item.ex' dan 'todo_live.ex'. Pada file 'todo_list.ex' yang akan ditambahkan adalah tag phx-hook dengan nilai 'TodoListHook' (phx-hook='TodoListHook'). Sehingga isi file 'todo_list.ex' akan berbentuk&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Pada file 'todo_list_item.ex' akan diubah fungsi 'live_redirect' menjadi 'live_patch'. Perbedaan 'live_redirect' dan 'live_patch' adalah pada 'live_redirect', phoenix yang akan menangani redirecting / pengarahan ke konten liveview yang baru dengan assign state yang baru. Pada 'live_patch' hal tersebut tidak dilakukan, semua operasi tersebut akan ditangani oleh Javascript. 'live_patch' hanya akan mengirimkan event ke &lt;em&gt;handle_params&lt;/em&gt;. Berikut isi dari file 'todo_list_item.ex'&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Bagaimana file 'todo_live.ex' ? Bagian yang dibutuhkan untuk dimodifikasi adalah bagian &lt;em&gt;handle_params&lt;/em&gt;. Berikut isi dari file 'todo_live.ex' setelah dimodifikasi&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Seperti bisa dilihat pada kode diatas, setelah penghapusan data operasi yang dilakukan adalah pengiriman event oleh fungsi 'push_event'. Event ini akan ditangkap oleh 'TodoListHook' pada file 'assets/js/todo_list_hook.js' di bagian 'this.handleEvent' yang kemudian akan menghapus element data todo yang bersangkutan pada &lt;em&gt;LiveView Component&lt;/em&gt; 'todo_list.ex'. Sebagai bahan perbandingan, berikut informasi yang dikirim dari server ke client browser, jika menggunakan &lt;em&gt;JS Interop&lt;/em&gt;. Data yang dikirim hanya informasi event dan todo data dari object yang telah dihapus di server. Dan terlihat dengan &lt;em&gt;JS Interop&lt;/em&gt; ini akan mengefisienkan pengiriman data dari server ke client browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BvUnYvO8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/20ipjgrgn3reew1vv5qf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BvUnYvO8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/20ipjgrgn3reew1vv5qf.png" width="500" alt="ilustrasi pengiriman data dengan menggunakan solusi JS Interop"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dan terakhir, perlu diketahui bahwa dengan JS Interop ini dimungkinkan untuk LiveView berinteraksi dengan framework Javascript lain, seperti JQuery, React, Vue.js dan lain sebagainya. Demikian sekilas mengenai JS Interop pada Phoenix LiveView, mudah-mudahan bisa bermanfaat. Terima kasih.&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>phoenixframework</category>
      <category>phoenixliveview</category>
      <category>jsinterop</category>
    </item>
    <item>
      <title>Web FullStack menggunakan Phoenix LiveView - Membangun Operasi CRUD</title>
      <dc:creator>Iskandar Rizki</dc:creator>
      <pubDate>Sun, 09 Aug 2020 15:10:46 +0000</pubDate>
      <link>https://dev.to/rizki96/pembangunan-web-fullstack-menggunakan-phoenix-liveview-part-2-2c1e</link>
      <guid>https://dev.to/rizki96/pembangunan-web-fullstack-menggunakan-phoenix-liveview-part-2-2c1e</guid>
      <description>&lt;p&gt;Dalam artikel kali ini akan coba dibawakan bagaimana mengimplementasikan CRUD (Create Read Update Delete) dalam Phoenix Liveview. Untuk kemudahan dan bisa memulai dengan cepat, bisa langsung melakukan git clone atau fork dari github repo berikut &lt;a href="https://github.com/rizki96/liveview_todo.git"&gt;https://github.com/rizki96/liveview_todo.git&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Perlu diketahui, database yang digunakan kali ini adalah &lt;a href="https://github.com/lucaong/cubdb"&gt;CubDB&lt;/a&gt;. Sedikit tentang CubDB, database ini adalah embedded key value database, dimana mekanisme penyimpanan datanya berlaku Copy On Write (COW) atau append only database untuk menjaga konsistensi data. Mekanisme ini berbeda dengan sqlite yang menggunakan mekanisme file locking. Dari mekanisme ini memungkinkan CubDB untuk disimpan dalam remote file system, seperti AWS S3 fuse mount atau google cloud storage fuse mount, atau file system seperti NFS maupun SMB. Karena dengan solusi &lt;em&gt;remote file system&lt;/em&gt; biasanya fitur file locking tidak dijamin, sehingga tidak dimungkinkan sqlite berjalan dengan benar.&lt;/p&gt;

&lt;p&gt;Untuk memulai mari kita bangun dulu interface untuk pengaksesan database CubDB. Interface ini akan disimpan dalam sebuah module elixir dalam file 'lib/liveview_todo/kv_store.ex'. Berikut isi dari file kv_store.ex&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Module elixir ini pada hakikatnya adalah sebuah supervisor actor yang akan menjalankan worker engine dari CubDB. Worker engine tentunya akan dijalankan pada saat aplikasi dimulai, oleh sebab itu tambahkan module &lt;strong&gt;LiveviewTodo.KvStore&lt;/strong&gt; ke dalam children supervisor, sebagai contoh nya adalah penggalan berikut pada file 'lib/liveview_todo/application.ex'&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Kemudian terdapat 2 bagian besar dari module &lt;strong&gt;LiveviewTodo.KvStore&lt;/strong&gt;, yaitu bagian dari MetaRecord dan bagian dari record data aplikasi. MetaRecord berisi informasi id yang terakhir di tulis dalam sebuah record data. Informasi mengenai record data ini disimpan dalam bentuk key, yang berisi nama tabel dan id. Dan record yang berisi value adalah informasi lengkap dari record data tersebut. Contoh adalah table todos, dengan record id 1, maka key-nya akan berisi {:todos, 1}.&lt;/p&gt;

&lt;p&gt;Data file dari CubDB sendiri akan disimpan dalam config.exs, dimana path dari file ini akan dibaca oleh module file 'kv_store.ex' tersebut. Berikut sebagian isi dari 'config.exs' tempat penyimpanan data file dari CubDB&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Phoenix framework sendiri mengenal konsep &lt;em&gt;Context&lt;/em&gt;, dimana 'kv_store.ex' sebagai interface database tidak diperbolehkan untuk diakses langsung oleh aplikasi, tetapi harus melalui konsep &lt;em&gt;Context&lt;/em&gt; ini. Untuk tiap aplikasi berbeda akan memiliki &lt;em&gt;Context&lt;/em&gt; yang berbeda sesuai dengan domain aplikasi yang bersangkutan. &lt;em&gt;Context&lt;/em&gt; aplikasi ini disimpan dalam module file 'lib/liveview_todo/tasks.ex' dimana dalam module ini terdapat query dan command yang akan diakses oleh aplikasi. Berikut isi dari module &lt;em&gt;Context&lt;/em&gt; Tasks&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Dalam &lt;em&gt;Context&lt;/em&gt; Tasks ini terdapat CRUD module yang akan digunakan oleh aplikasi LiveView. Bagaimana penggunaan CRUD ini dalam LiveView ? Berikut module liveview yang telah dibuat pada artikel sebelumnya yaitu 'todo_live.ex', dengan ditambahkan fungsi list_todos untuk menampilkan semua data Todo.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Jika diperhatikan ada beberapa operasi &lt;em&gt;pattern matching&lt;/em&gt; dalam kode ini. Seperti misalnya &lt;em&gt;{:ok, todos} = Tasks.list_todos()&lt;/em&gt;, Dalam Elixir operator '=' bukan hanya berlaku sebagai assignment tapi juga sebagai &lt;em&gt;match&lt;/em&gt; operator. Dimana &lt;em&gt;match&lt;/em&gt; operator akan melakukan pencocokan antara sisi kiri dan kanan dari operasi '='. Kemudian dalam Phoenix (tidak hanya LiveView) dikenal perintah &lt;em&gt;assign&lt;/em&gt;, contohnya adalah &lt;em&gt;socket = assign(socket, todos: todos)&lt;/em&gt;, perintah ini berfungsi untuk merubah state socket yang berisi variable yang dapat diakses dalam halaman HTML yang di render oleh LiveView. Dalam halaman HTML tersebut variable yang di &lt;em&gt;assign&lt;/em&gt; dalam socket, seperti todos akan dikenal sebagai '@todos'. Dalam kode ini juga digunakan &lt;em&gt;temporary_assigns&lt;/em&gt; seperti pada &lt;em&gt;{:ok, assign(socket, temporary_assigns: [todos: []])}&lt;/em&gt;. &lt;em&gt;temporary_assigns&lt;/em&gt; akan memberlakukan variable todos sebagai &lt;strong&gt;nilai sementara&lt;/strong&gt; agar pada event berikutnya tidak dikirim semua data lagi ke halaman HTML LiveView. Fitur &lt;em&gt;temporary_assigns&lt;/em&gt; ini yang akan membuat pengiriman data antara backend dan frontend menjadi efisien, karena semua data hanya akan dikirim sekali ketika event &lt;em&gt;mount&lt;/em&gt;. Event berikutnya hanya data yang berubah saja yang akan dikirimkan. Perlu diketahui juga, data &lt;em&gt;todos&lt;/em&gt; yang dikirim ke halaman HTML, ini secara otomatis akan di serialisasi kan sebagai data JSON, karena dalam module Tasks sebelumnya, module struct Todo telah ditambahkan line berikut : &lt;em&gt;@derive {Jason.Encoder, only: [:id, :text, :completed]}&lt;/em&gt; , baris ini yang akan membuat framework Phoenix menginterpretasikan struct Todo menjadi JSON jika dibutuhkan, dan hanya field-field yang terpilih saja akan disertakan sebagai JSON object.&lt;/p&gt;

&lt;p&gt;Kemudian bagaimana untuk menampilkan query &lt;em&gt;list_todos&lt;/em&gt; ini dalam HTML ? Untuk itu mari kita buat LiveView &lt;em&gt;Component&lt;/em&gt; yang berisi HTML dengan item-item 'todos'. Seperti sebelumnya buat &lt;em&gt;Component&lt;/em&gt; dalam direktori 'lib/liveview_todo_web/live/components/todos' dengan nama file 'todo_list.ex' dan 'todo_list_item.ex'. Berturut-turut file tersebut berfungsi sebagai renderer untuk &lt;em&gt;list of todos&lt;/em&gt; dan &lt;em&gt;item todo&lt;/em&gt;. Berikut berturut-turut isi dari 'todo_list.ex' dan 'todo_list_item.ex'&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Untuk mengetahui &lt;em&gt;Component&lt;/em&gt; tersebut berfungsi, diharuskan untuk menambahkan &lt;em&gt;Component&lt;/em&gt; tersebut ke halaman utama dari LiveView todo_live.html.leex. Sehingga halaman todo_live.html.leex akan berisi seperti berikut&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Tentu saja setelah ini harus ditambahkan juga fungsi untuk melakukan penambahan dan pengubahan data ke dalam database. Sehingga file 'todo_live.ex' akan ditambahkan event untuk melakukan &lt;em&gt;add dan update&lt;/em&gt;. Berikut ini isi dari 'todo_live.ex'&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Dalam event yang akan di trigger dari halaman HTML pun mengenal &lt;em&gt;pattern matching&lt;/em&gt;. Contohnya adalah baris &lt;em&gt;'def handle_event("add_todo", %{"todo" =&amp;gt; todo} = _params, socket) do'&lt;/em&gt; dan &lt;em&gt;'def handle_event("update_todo:" &amp;lt;&amp;gt; todo_id, params, socket) do'&lt;/em&gt;. Parameter pada baris sebelumnya yaitu &lt;em&gt;'%{"todo" =&amp;gt; todo} = _params'&lt;/em&gt;, params yang dikirim ke dalam event kita &lt;em&gt;pattern match&lt;/em&gt; sebagai tipe &lt;em&gt;map&lt;/em&gt; dan dilakukan ekstraksi terhadap nilai dalam map tersebut. Sedangkan params secara keseluruhan akan diabaikan dengan menambahkan '_' di depan nama variablenya. Begitu juga pada baris event berikutnya, &lt;em&gt;"update_todo:" &amp;lt;&amp;gt; todo_id&lt;/em&gt; merupakan sebuah &lt;em&gt;pattern match&lt;/em&gt;. Yang dilakukan disini adalah ekstraksi string untuk mendapatkan bagian yang dinginkan. Misalnya secara keseluruhan string nya adalah "update_todo:2" maka variable todo_id akan bernilai string '2'. Oleh sebab itu &lt;em&gt;pattern matching&lt;/em&gt; adalah salah satu kekuatan dari bahasa Elixir untuk membuat kode lebih jelas dan ringkas.&lt;/p&gt;

&lt;p&gt;Setelah fungsi &lt;em&gt;add dan update&lt;/em&gt;, jalankan 'mix phx.server' untuk menjalankan phoenix web server dan akses ke halaman '&lt;a href="http://localhost:4000/todo"&gt;http://localhost:4000/todo&lt;/a&gt;'. Coba untuk menambahkan todo, misalnya adalah 'testing 1'. Maka akan terlihat seperti berikut ini&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o-Cr8yFm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/s1gbdxyej7iv1c373dxc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o-Cr8yFm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/s1gbdxyej7iv1c373dxc.png" alt="Tampilan todos app dengan LiveView"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bagaimana cara untuk melihat data yang dipertukarkan antara frontend dan backend dalam LiveView ? Buka bagian developer inspect element pada browser, kemudian pada bagian console javascript jalankan perintah &lt;em&gt;liveSocket.enableDebug()&lt;/em&gt;. Berikut ini contoh gambarnya &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ppEISyz9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7ryu17m23cowuq01bm9t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ppEISyz9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7ryu17m23cowuq01bm9t.png" alt="Contoh liveSocket.enabledDebug()"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setelah itu coba untuk melakukan update dan akan terlihat hanya data yang berubah saja akan dikirim ke backend server. Contoh adalah sebagai berikut&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ek21Mt8E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dh0mwr4qtodv16v56ebe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ek21Mt8E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dh0mwr4qtodv16v56ebe.png" width="500" alt="debug data yang dikirim ke backend server"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kemudian jika ditambahkan data todo berikutnya akan terlihat data baru ditambahkan pada element terakhir dari list_todo dan semua item todo terurut dari item todo yang lama ke item todo yang baru. Hal ini dimungkinkan dengan fitur DOM patching dari phoenix LiveView, dimana pada element list ditambahkan attribute &lt;em&gt;phx-update="append"&lt;/em&gt;. Bagaimana bila dibutuhkan sebaliknya ? data yang ditambahkan selalu berada diatas dan akan berurutan terbalik dari item todo yang baru ke item todo yang lama ? Caranya cukup mudah, yaitu ubah query list_todos menjadi &lt;em&gt;reverse=true&lt;/em&gt;, query ini terdapat pada &lt;em&gt;Context&lt;/em&gt; Tasks dan ubah nilai phx-update pada &lt;em&gt;Component&lt;/em&gt; 'list_item.ex' menjadi &lt;em&gt;phx-update="prepend"&lt;/em&gt;. Maka ketika data ditambahkan todo akan terlihat seperti gambar dibawah&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Dfe41tbH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/edtrc6s6jgoz1q5iq27g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Dfe41tbH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/edtrc6s6jgoz1q5iq27g.png" width="500" alt="item todo berurut dari terbaru ke yang lama"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bagaimana jika kita ingin menampilkan lebih &lt;em&gt;Custom&lt;/em&gt; dari pada hanya sekedar &lt;em&gt;append dan prepend&lt;/em&gt;. Jawabannya adalah gunakan &lt;a href="https://hexdocs.pm/phoenix_live_view/js-interop.html"&gt;JS Interop Hooks&lt;/a&gt; dalam LiveView.&lt;/p&gt;

&lt;p&gt;Demikian bagian ke 2 dari artikel membangun web fullstack dengan menggunakan Phoenix LiveView, untuk JS Interop Hooks silahkan dicoba sebagai sebuah latihan, dan bisa dicoba juga untuk menambahkan fitur hapus. Terima kasih telah membaca artikel ini dan kemudian mencoba Phoenix LiveView, semoga lancar dan jika ada kritik, saran atau pertanyaan dapat langsung kontak melalui &lt;a href="https://www.linkedin.com/in/iskandar-rizki-47063139/"&gt;linkedin&lt;/a&gt; atau twitter di &lt;a href="https://twitter.com/rizki"&gt;@rizki&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>phoenixframework</category>
      <category>phoenixliveview</category>
    </item>
    <item>
      <title>Web FullStack menggunakan Phoenix LiveView - Memulai Pembangunan</title>
      <dc:creator>Iskandar Rizki</dc:creator>
      <pubDate>Fri, 31 Jul 2020 09:38:35 +0000</pubDate>
      <link>https://dev.to/rizki96/pembangunan-web-fullstack-menggunakan-phoenix-liveview-part-1-391o</link>
      <guid>https://dev.to/rizki96/pembangunan-web-fullstack-menggunakan-phoenix-liveview-part-1-391o</guid>
      <description>&lt;p&gt;Banyak dari web developer saat ini menggunakan teknologi frontend seperti diantaranya ReactJS, AngularJS dan VueJS yang dipadukan dengan RESTful framework, GraphQL atau menggunakan teknologi seperti websocket untuk berinteraksi dengan backend service. Terkadang solusi ReactJS, AngularJS atau frontend framework lainnya terlalu kompleks jika hanya ditujukan untuk komunikasi dengan backend, tanpa misalnya penggunaan fitur Offline First atau fitur lain yang memungkinkan berjalan mandiri tanpa backend service. Terlebih bila backend service berbeda bahasa pemrograman dengan frontend, dikhawatirkan terjadi gap atau pemisah diatara keduanya.&lt;/p&gt;

&lt;p&gt;Untuk pengguna Elixir ada pilihan yang menarik untuk melakukan pembangunan Web Fullstack sehingga tidak terjadi gap atau pemisah antara frontend hingga backend, yaitu dengan menggunakan framework Phoenix LiveView. Apa yang menjadi kelebihan Phoenix framework dengan LiveView ini untuk Web Fullstack ? Phoenix framework seperti pada web framework lainnya membawakan konsep MVC, memiliki gaya development mengikuti framework Ruby on Rails, yang membawa konsep &lt;em&gt;convention over configuration&lt;/em&gt; dimana banyak aturan telah disepakati pada permulaan konsep framework dibangun, code generator atau scaffolding untuk meminimalisir kesalahan dan memudahkan developer untuk memulai pembangunan. Sedangkan kelebihan LiveView untuk Web Fullstack dibandingkan menggunakan teknologi lain adalah,&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Kode yang dibangun di dominasi dengan kode Elixir dan HTML, meminimalisir penggunaan Javascript, Javascript tetap digunakan hanya pada kondisi siklus callback tertentu, yang telah ditetapkan oleh LiveView. Pada LiveView mekanisme ini dikenal dengan istilah &lt;em&gt;Javascript Hooks&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Komunikasi antara Frontend dan Backend sangat alami dan &lt;em&gt;seamless&lt;/em&gt; (tanpa ada penghalang/barrier dan gap), tidak memerlukan kode http client atau websocket client di sisi Frontend, atau membangun RESTFul endpoint di sisi Backend. Karena tiap perubahan object dan event yang terjadi baik di frontend dan backend bisa langsung saling diakses oleh kedua pihak frontend dan backend tersebut.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pertukaran data antara Frontend dan Backend dapat diminimalkan, dengan mekanisme &lt;em&gt;DOM patching&lt;/em&gt; dan &lt;em&gt;temporary assigns&lt;/em&gt; data yang dikirim dari server ke frontend minimal hanya terbatas &lt;em&gt;DOM element&lt;/em&gt; yang berubah nilainya pada browser, begitu juga dari frontend ke server hanya data yang berasal dari &lt;em&gt;DOM element&lt;/em&gt; yang terjadi event saja datanya akan dikirimkan.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Seperti apa proses pembangunan framework Phoenix LiveView ? Mari simak berikut ini. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Untuk memulai dibutuhkan Erlang OTP minimal versi 21, Elixir minimal versi 1.9 dan NodeJS versi 12 (membutuhkan NPM), cara instalasi erlang &amp;amp; elixir diberbagai platform bisa lihat disini &lt;a href="https://elixir-lang.org/install.html" rel="noopener noreferrer"&gt;https://elixir-lang.org/install.html&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Setelah erlang dan elixir terinstall, pastikan perintah 'mix' telah terinstall, coba dengan menjalankan 'mix help'&lt;/li&gt;
&lt;li&gt;install phoenix framework 'mix archive.install hex phx_new 1.5.4'&lt;/li&gt;
&lt;li&gt;buat project baru 'mix phx.new liveview_todo --no-dashboard --no-ecto --live'&lt;/li&gt;
&lt;li&gt;cd liveview_todo&lt;/li&gt;
&lt;li&gt;edit file mix.exs, ubah bagian '{:phoenix_live_view, "~&amp;gt; 0.13.0"}' menjadi '{:phoenix_live_view, "~&amp;gt; 0.14.0"}'&lt;/li&gt;
&lt;li&gt;Menggunakan database &lt;a href="https://github.com/lucaong/cubdb" rel="noopener noreferrer"&gt;CUBDB&lt;/a&gt;, edit file mix.exs, tambahkan '{:cubdb, "~&amp;gt; 1.0.0-rc.4"},' dibaris terakhir sesudah '{:plug_cowboy, "~&amp;gt; 2.0"}', hasil akhir seperti ini&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
 

&lt;ul&gt;
&lt;li&gt;mix deps.get&lt;/li&gt;
&lt;li&gt;cd assets &amp;amp;&amp;amp; npm install &amp;amp;&amp;amp; node node_modules/webpack/bin/webpack.js --mode development &amp;amp;&amp;amp; cd ..&lt;/li&gt;
&lt;li&gt;mix compile&lt;/li&gt;
&lt;li&gt;mencoba untuk menjalankan web server 'mix phx.server' dan akses alamat '&lt;a href="http://localhost:4000" rel="noopener noreferrer"&gt;http://localhost:4000&lt;/a&gt;' pada browser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frizki96%2Fliveview_todo%2Fmaster%2Fcontent%2Flocalhost4000-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frizki96%2Fliveview_todo%2Fmaster%2Fcontent%2Flocalhost4000-1.png" alt="Tampilan web untuk localhost:4000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setelah semuanya berjalan baik dan webserver bisa dijalankan, mari kita mulai membuat kode liveview. Paling tidak ada 2 pendekatan untuk memulai kode liveview, yaitu dengan menggunakan scaffolding dan dengan cara manual membuat file dengan akhiran '_live.ex'. Sayangnya dengan cara scaffolding sangat erat berintegrasi dengan library Ecto (membutuhkan postgresql, mysql atau SQL Server), kita menggunakan cara ke 2 yaitu secara manual membuat file dengan akhiran '_live.ex'. Langsung saja kita buat file baru dengan nama 'todo_live.ex' pada direktori 'lib/liveview_todo_web/live', dan proses ini berlaku suatu konvensi atau perjanjian bahwa untuk membuat file html yang akan digunakan oleh 'todo_live.ex', developer hanya butuh membuat sebuah file lagi yaitu 'todo_live.html.leex'. Hal ini mengikuti konsep &lt;em&gt;convention over configuration&lt;/em&gt;, dimana banyak hal sudah ditentukan / disepakati dari permulaan tentang aturan-aturan yang berlaku di framework. Hasil akhir seperti gambar dibawah.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frizki96%2Fliveview_todo%2Fmaster%2Fcontent%2Fcreate-live-file.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frizki96%2Fliveview_todo%2Fmaster%2Fcontent%2Fcreate-live-file.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Untuk mencoba apakah halaman liveview bisa diakses, dibutuhkan minimal kode seperti berikut pada file 'todo_live.ex'.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Dan untuk mencoba apakah halaman 'todo_live.html.leex' dapat bekerja dengan benar, coba untuk memasukkan kode html sebagai berikut.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Dan tambahkan juga pada file 'router.ex' URL yang akan dipetakan ke file 'todo_live.ex'. File 'router.ex' terdapat pada direktori 'lib/liveview_todo_web'. Tambahkan line: &lt;strong&gt;'live "/todo", TodoLive, :index'&lt;/strong&gt;, seperti berikut ini.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Jika masih menjalankan 'mix phx.server', coba akses dengan browser ke halaman '&lt;a href="http://localhost:4000/todo" rel="noopener noreferrer"&gt;http://localhost:4000/todo&lt;/a&gt;', maka akan muncul halaman seperti berikut.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frizki96%2Fliveview_todo%2Fmaster%2Fcontent%2Ftodo-page-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frizki96%2Fliveview_todo%2Fmaster%2Fcontent%2Ftodo-page-1.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seperti juga ReactJS dan framework frontend lainnya, LiveView juga memiliki konsep &lt;em&gt;Component&lt;/em&gt;. &lt;em&gt;Component&lt;/em&gt; adalah sebuah cara / metode melakukan pemecahan element User Interface agar nantinya dapat dipergunakan ulang di halaman lain (&lt;em&gt;Reuse&lt;/em&gt;) dan diharapkan dengan &lt;em&gt;Component&lt;/em&gt; ini juga akan lebih efisien dalam pertukaran data antara browser dan server, dimana &lt;em&gt;static Component&lt;/em&gt; dapat diberlakukan mekanisme &lt;em&gt;cache&lt;/em&gt; pada browser. Berikut cara membangun &lt;em&gt;Component&lt;/em&gt; pada LiveView. Pertama tentukan dimana &lt;em&gt;Component&lt;/em&gt; akan ditempatkan pada project. Kali ini akan diberikan tempat pada direktori 'lib/liveview_todo_web/live' dengan membuat direktori baru yaitu 'components'. Dan tambahkan juga direktori 'todos' ke dalam direktori 'components'. Sehingga akan terlihat seperti dibawah.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frizki96%2Fliveview_todo%2Fmaster%2Fcontent%2Fcomponents-todos-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frizki96%2Fliveview_todo%2Fmaster%2Fcontent%2Fcomponents-todos-1.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dan tambahkan juga &lt;em&gt;Component&lt;/em&gt; pertama kita dengan membuat file 'add_todo_form.ex' di dalam direktori 'todos'. Akan terlihat seperti dibawah.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frizki96%2Fliveview_todo%2Fmaster%2Fcontent%2Fadd-todo-form.ex-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frizki96%2Fliveview_todo%2Fmaster%2Fcontent%2Fadd-todo-form.ex-1.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dalam file 'add_todo_form.ex' tambahkan kode seperti dibawah ini.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Untuk menggunakan &lt;em&gt;Component&lt;/em&gt; 'add_todo_form.ex', bisa mulai menambahkan &lt;em&gt;Component&lt;/em&gt; tersebut ke dalam file 'todo_live.html.leex' dan menambahkan baris &lt;strong&gt;'alias LiveviewTodoWeb.Todos.AddTodoFormComponent'&lt;/strong&gt; ke dalam file 'todo_live.ex'. Sehingga file 'todo_live.ex' dan 'todo_live.html.leex' yang terbaru akan berbentuk seperti dibawah ini.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Dan jika halaman '&lt;a href="http://localhost:4000/todo" rel="noopener noreferrer"&gt;http://localhost:4000/todo&lt;/a&gt;' diakses dari browser, akan muncul &lt;em&gt;Component&lt;/em&gt; 'add_todo_form.ex' yang telah dibuat tadi.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frizki96%2Fliveview_todo%2Fmaster%2Fcontent%2Ftodo-page-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Frizki96%2Fliveview_todo%2Fmaster%2Fcontent%2Ftodo-page-2.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setelah ini bagaimana mengirimkan informasi event yang akan dikirim ke server, misalnya ketika tombol 'Add Todo' diklik ? Caranya cukup mudah, ada 2 langkah yang harus dilakukan, yaitu&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;menambahkan kode: &lt;strong&gt;'[phx_submit: :add_todo]'&lt;/strong&gt; di dalam &lt;em&gt;Component&lt;/em&gt; 'add_todo_form.ex', sehingga akan berbentuk seperti dibawah ini. &lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;menambahkan kode event handler &lt;strong&gt;"add_todo"&lt;/strong&gt; pada file 'todo_live.ex', seperti dibawah ini. &lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apabila dicoba untuk memasukkan kata 'testing' dari halaman '&lt;a href="http://localhost:4000/todo" rel="noopener noreferrer"&gt;http://localhost:4000/todo&lt;/a&gt;' ke dalam input text dan kemudian klik tombol 'Add Todo', maka pada log server akan muncul '[debug] %{"text" =&amp;gt; "testing"}'. Artinya event yang dikirimkan dari browser telah berhasil dikirim dan ditampilkan pada log yang terdapat di server.&lt;/p&gt;

&lt;p&gt;Demikian bagian pertama dari pengenalan mengenai Phoenix LiveView. Untuk lebih lengkapnya, repositori tutorial ini dapat diakses melalui &lt;a href="https://github.com/rizki96/liveview_todo" rel="noopener noreferrer"&gt;https://github.com/rizki96/liveview_todo&lt;/a&gt;. Dan nanti pada bagian berikutnya akan coba dijelaskan mengenai proses penambahan data, update data dan hal-hal yang berhubungan dengan database, dan bagaimana melakukan pengiriman data yang efisien dengan mekanisme Phoenix LiveView ini.&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>phoenixframework</category>
      <category>liveview</category>
    </item>
    <item>
      <title>Berbagai alasan melakukan Programming dalam Rust</title>
      <dc:creator>Iskandar Rizki</dc:creator>
      <pubDate>Sat, 06 Jun 2020 15:45:39 +0000</pubDate>
      <link>https://dev.to/rizki96/berbagai-alasan-melakukan-programming-dalam-rust-p67</link>
      <guid>https://dev.to/rizki96/berbagai-alasan-melakukan-programming-dalam-rust-p67</guid>
      <description>&lt;p&gt;Baru saja membaca artikel tentang &lt;a href="https://stackoverflow.blog/2020/06/05/why-the-developers-who-use-rust-love-it-so-much/"&gt;Rust sebagai bahasa pemrograman yang dicintai&lt;/a&gt;, membuat saya terpancing untuk menulis artikel tentang Rust. Pengalaman menggunakan bahasa pemrograman Rust ini adalah ketika membuat &lt;a href="https://github.com/rizki96/phy_channels/"&gt;wrapper Phoenix Channels client dalam Python&lt;/a&gt; untuk kebutuhan salah satu Python project. Seperti juga C/C++, Rust memiliki native binding dengan Python melalui &lt;a href="https://github.com/PyO3/pyo3"&gt;pyo3&lt;/a&gt; atau melalui FFI. Dengan pyo3 melakukan native binding antara Python dan Rust atau sebaliknya menjadi mudah.&lt;/p&gt;

&lt;p&gt;Bukan hanya native binding saja, berbagai alasan mengapa Rust akan menjadi sebuah pilihan bahasa pemrograman yang populer, setelah Google mengeluarkan laporan bahwa &lt;a href="https://nikolanews.com/chrome-70-of-all-security-bugs-are-memory-safety-issues/"&gt;70 % masalah keamanan dalam program adalah memory safety&lt;/a&gt;, kemudian Microsoft mengeluarkan &lt;a href="https://www.zdnet.com/article/microsoft-70-percent-of-all-security-bugs-are-memory-safety-issues/"&gt;laporan yang sama&lt;/a&gt;. Membuat masa depan Rust menjadi sangat jelas mengapa bahasa pemrograman ini menjadi kebutuhan penting.&lt;/p&gt;

&lt;p&gt;Bagi C/C++ programmer, Rust merupakan sebuah doa yang terkabul, banyak fitur dan konsep baru yang dapat membantu C/C++ programmer untuk membuat program sangat stabil dengan pengamanan (safety) di berbagai sisi (type, thread and memory safety). Dengan Rust, programmer diajak untuk membuat spesifikasi dengan aturan-aturan yang telah ditentukan dari tiap variable yang dibuat dan fungsi atau method yang dipanggil. Spesifikasi dan aturan-aturan ini bukan hanya dari tipe, tapi juga hal lain yang dibutuhkan untuk pengamanan program.&lt;/p&gt;

&lt;p&gt;Berikut hal-hal dari yang biasa sampai luar biasa mengenai Rust, menurut pengamatan dan mungkin salah satu atau salah duanya bisa menjadi alasan untuk melakukan programming dalam Rust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kompilasi kode
&lt;/h2&gt;

&lt;p&gt;Ini merupakan hal yang biasa ditemukan di bahasa pemrograman seperti C/C++, Golang, dimana dengan kompilasi kita bisa mendapatkan kecepatan yang memuaskan dari program.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memiliki Tipe Statik
&lt;/h2&gt;

&lt;p&gt;Tipe statik (Static Type Binding) juga ditemukan di bahasa pemrograman C/C++, Golang, Java. Dapat membantu programmer secara cepat menemukan kesalahan pada penugasan tipe (assignment type mismatch) atau kesalahan tipe dalam alokasi memory pada saat kompilasi sehingga program dapat terhindar dari crash ketika sedang berjalan (runtime).&lt;/p&gt;

&lt;h2&gt;
  
  
  Perpaduan antara high level dan low level programming
&lt;/h2&gt;

&lt;p&gt;Di satu sisi Rust mengajak programmer untuk melakukan programming secara high level, misalnya dengan konsep &lt;strong&gt;Container&lt;/strong&gt; (vector, hashmap, etc.) untuk data struktur dan konsep &lt;strong&gt;Generic Template&lt;/strong&gt; (&amp;lt;T&amp;gt;) untuk mendefinisikan tipe. Tapi juga tidak meninggalkan low level programming, seperti pengaksesan memory reference (&amp;amp;), memory pointer (*), dengan catatan low level programming ini memiliki aturan ketat dalam penggunaannya, agar pengamanan tetap terjaga. Perpaduan high level dan low level ini juga bisa ditemukan pada C++.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pengamanan thread dan memory / thread and memory safety
&lt;/h2&gt;

&lt;p&gt;Dari thread dan memory, Rust banyak menawarkan konsep baru yang luar biasa. Diantaranya adalah konsep &lt;strong&gt;Ownership&lt;/strong&gt;, dimana alamat memory bisa "dipinjam" (borrow) kepada assignment variable atau passing variable (melalui fungsi). Aturan ini akan berlaku berbeda untuk mutable type (tipe yang dapat di tulis ulang) dan immutable type (tipe yang tidak dapat ditulis ulang). Dan aturan ini dijaga ketat oleh kompilator (compiler) dengan istilah "borrow checker". Perlu diketahui juga, konsep dasar &lt;a href="https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html"&gt;Ownership&lt;/a&gt; memory di Rust ini yaitu move (borrow), copy, dan clone. Dan ada juga konsep &lt;strong&gt;Lifetime&lt;/strong&gt; ('static, 'a, etc.) dari sebuah tipe yang dideklarasikan sebagai variable, yaitu setiap tipe yang dideklarasikan memiliki waktu hidup, waktu hidup ini bisa ditentukan oleh programmer sendiri atau berlaku secara umum (default) dari aturan Rust sendiri, aturan default untuk Lifetime ini disebut &lt;a href="https://doc.rust-lang.org/reference/lifetime-elision.html"&gt;Lifetime Elision&lt;/a&gt;. Untuk konsep &lt;strong&gt;Mutex&lt;/strong&gt; sebagai pengamanan memory pada thread berlaku sebagai Generic Template, dimana penguncian sumber daya (resource locking) memfokuskan pada variable yang dialokasikan dan bukan pada baris kode, ini berbeda dengan konsep mutex lock pada bahasa C/C++ atau Java yang lama. Karena tidak menggunakan locking atau kesalahan menempatkan locking pada baris kode dapat menimbulkan race condition atau deadlock pada program.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tidak memiliki pengumpul sampah / garbage collection
&lt;/h2&gt;

&lt;p&gt;Tentu saja hal ini menimbulkan trade off, "there is no such a thing as a free lunch", fitur GC dibebankan pada programmer ketika mendefinisikan variable dan menjadi spesifikasi yang harus dideklarasikan oleh programmer. Dan akan dicek pada saat kompilasi. Fitur ini antara lain adalah &lt;strong&gt;Reference Counting&lt;/strong&gt; dimana alamat memory memiliki variable penghitung (counter), yang akan ditambah ketika ada referensi ke variable baru atau akan dikurangi ketika lifetime berakhir atau dilakukan dereferensi. Fitur &lt;strong&gt;Lifetime&lt;/strong&gt; yang disebutkan sebelumnya juga adalah salah satu fitur dari GC, dimana pada Rust menjadi tanggung jawab programmer. Keuntungan dengan tidak adanya GC ini adalah pada saat program berjalan (runtime) tidak ada overhead memory yang digunakan, karena pada kebanyakan bahasa, misalnya Java atau Python, GC menjadi salah satu bottleneck performance, karena bisa menghabiskan resource atau memory program.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memiliki fitur pemrograman fungsional
&lt;/h2&gt;

&lt;p&gt;Walaupun pemrograman Rust bersifat imperative, tapi ada beberapa fitur pemrograman fungsional yang diadopsi, diantaranya adalah &lt;strong&gt;Immutable Type&lt;/strong&gt; atau tipe yang tidak bisa ditulis ulang. &lt;strong&gt;Container Iterator&lt;/strong&gt; yang bersifat deklaratif, seperti ".map", ".for_each", ".filter_map", etc. Dan &lt;strong&gt;Pattern Matching&lt;/strong&gt; dengan keyword "match" dan generic template "Option". Perlu diketahui juga, karena Rust memaksa programmer untuk selalu melakukan pengamanan, pada tiap pemanggilan method atau fungsi SEBENARNYA dibutuhkan pattern matching untuk menangani Error. Tapi penanganan Error dengan pattern matching ini bisa saja tidak dilakukan dengan cara pemanggilan method "unwrap", konsekuensinya adalah bila terjadi error akan terjadi "panic".&lt;/p&gt;

&lt;p&gt;Demikian sedikit pengamatan mengenai bahasa pemrograman Rust. Pendapat saya adalah jika menginginkan stabilitias, performa yang memuaskan dan keamanan pada program, Rust adalah pilihan yang cocok. Tapi jika menginginkan produktivitas, Rust belum tentu bisa menjadi pilihan. Bagi saya Rust sangat dibutuhkan untuk system programming (kebutuhan os, network atau device programming), dan akan menjadi second atau third layer programming laguange, ketika dibutuhkan untuk speed dan stability pengganti C/C++, sebagai wrapper program-program yang ditulis dengan bahasa Python, Ruby atau Elixir. Hal ini seperti yang telah &lt;a href="https://blog.discord.com/using-rust-to-scale-elixir-for-11-million-concurrent-users-c6f19fc029d3"&gt;dilakukan oleh Discord&lt;/a&gt;, dimana penggunaan Rust dengan rustler (Erlang interface to Rust) dapat meningkatkan speed untuk struktur datanya, tapi untuk konsep distributed system, tetap menggunakan Elixir.&lt;/p&gt;

</description>
      <category>programmer</category>
      <category>rust</category>
      <category>c</category>
      <category>cpp</category>
    </item>
    <item>
      <title>Filosofi “Let It CRASH!” sebagai pola pikir untuk menangani kesalahan pada sistem</title>
      <dc:creator>Iskandar Rizki</dc:creator>
      <pubDate>Fri, 08 May 2020 15:55:53 +0000</pubDate>
      <link>https://dev.to/rizki96/filosofi-let-it-crash-sebagai-pola-pikir-untuk-menangani-kesalahan-pada-sistem-k36</link>
      <guid>https://dev.to/rizki96/filosofi-let-it-crash-sebagai-pola-pikir-untuk-menangani-kesalahan-pada-sistem-k36</guid>
      <description>&lt;p&gt;Hampir setiap bahasa pemrograman memiliki filosofi agar membantu para penggunanya (dalam hal ini programmer) untuk mengerti behaviour, sifat alami dan citra yang ingin dibangun oleh pengembang bahasa pemrograman tersebut.&lt;/p&gt;

&lt;p&gt;Misalnya bahasa pemrograman Golang memiliki filosofi “Radical Simple”, bagaimana bahasa Golang ini ingin mencitrakan dirinya sebagai bahasa pemrograman yang sederhana dan mudah untuk dikuasai. Kemudian ada Python dengan “Explicit is better than Implicit”, Python berusaha mengkomunikasikan kepada programmernya untuk selalu gamblang dalam melakukan aktifitas koding, tanpa “magic code” dengan suatu koding yang tersembunyi di belakang layar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filosofi di Erlang/Elixir&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Erlang dan dalam hal ini Elixir pun menganut filosofi “Let It CRASH!”. Dengan “Let It CRASH!” ini, pengembang dari Erlang ingin mengkomunikasikan bagaimana penanganan kesalahan pada program (Error Handling), sebagian besar telah ditangani oleh BEAM (Erlang VM). Perlu diingat bahwa bukan berarti sebagai programmer tidak perlu memikirkan Error Handling, hanya saja sebagian besar tanggung jawab dari Error Handling ini telah diambil alih oleh BEAM.&lt;/p&gt;

&lt;p&gt;Jika kita perhatikan tentang Error Handling pada bahasa pemrograman yang lain, programmer dipaksa untuk melakukan “Defensive Programming”, dimana programmer harus memikirkan setiap Error yang mungkin akan muncul jika suatu baris kode di eksekusi dan harus mengantisipasi semua kemungkinan Error tersebut dengan menangkap Exception atau menulis kode “if else”. Padahal tidak semua Error adalah kesalahan pada kode, ada Error yang bukan merupakan kendali dari programmer, misalnya kesalahan pada Database, kesalahan Network, kegagalan pada operasi Disk (Disk Failure) dan kesalahan lain yang berasal dari Sistem. Disini BEAM ingin memposisikan dirinya sebagai “penghancur Defensive Programming” (&lt;a href="https://www.amberbit.com/blog/2019/7/26/the-misunderstanding-of-let-it-crash/"&gt;https://www.amberbit.com/blog/2019/7/26/the-misunderstanding-of-let-it-crash/&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Fb7b-5HJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mogaao0dxfgo99dnuiwu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Fb7b-5HJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mogaao0dxfgo99dnuiwu.png" alt="Alt Text"&gt;&lt;/a&gt;Ilustrasi Sebagian kecil class Exception dan Error pada Java yang harus ditangani oleh programmer (&lt;a href="https://beginnersbook.com/2013/04/java-exception-handling/"&gt;https://beginnersbook.com/2013/04/java-exception-handling/&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Filosofi “Let It Crash!” juga ingin menyatakan bahwa dengan terjadinya Error dari program, baik yang berasal dari Error kode atau Error sistem, bukan berarti keseluruhan program yang berjalan akan berhenti atau Crash. Telah disinggung pada &lt;a href="https://dev.to/rizki96/mengenal-pemrograman-konkurensi-pada-bahasa-pemrograman-elixir-2959"&gt;artikel blog ini sebelumnya&lt;/a&gt; bagaimana Erlang menganut “Actor-based Concurrency”, dimana setiap proses yang dikerjakan ada banyak (ratusan, ribuan, jutaan) Aktor yang melakukan pekerjaan. Bagaimana jika pekerjaan yang dikerjakan oleh beberapa jumlah Aktor tadi terjadi Error ? Jawabannya adalah hanya Aktor dengan pekerjaan yang Error saja yang akan Crash, sedangkan sisa Aktor lain akan terus bekerja. Kemudian apakah Aktor yang Crash akan tetap Crash ? Jawabannya adalah tidak, ada “Supervisor” yang akan menghidupkan kembali Aktor yang Crash.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apa itu “Supervisor” pada Erlang/Elixir&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Supervisor pada Erlang/Elixir adalah jenis lain dari Aktor yang bertugas untuk melakukan “link and monitor” kepada Aktor lain yang bertugas untuk menjalankan proses (Worker). Dengan link, Supervisor dapat mengikat secara kuat dengan Aktor turunannya, sehingga jika terjadi Crash pada Aktor yang dimonitor, notifikasi atau pesan pemberitahuan akan dikirimkan ke Supervisor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DYnFwbeF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/z054byqewhg68690ifii.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DYnFwbeF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/z054byqewhg68690ifii.png" alt="Alt Text"&gt;&lt;/a&gt;Ilustrasi contoh hubungan antara Supervisor dan Worker pada BEAM (supevision tree). Supervisor dapat melakukan “link and monitor” pada Worker turunannya (&lt;a href="http://isaacjarquin.github.io/software/2017/09/01/supervision-tree.html"&gt;http://isaacjarquin.github.io/software/2017/09/01/supervision-tree.html&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Dengan mekanisme ini, cara kerja Aktor di dalam BEAM sangat teratur dan terorganisir, dimana seperti sebuah organisasi, yang didalamnya terdapat konsep Supervisor dan Worker yang akan memastikan seluruh jalannya aplikasi/sistem berjalan dengan lancar. Ini merupakan sebuah konsep toleransi terhadap kesalahan (Fault Tolerance) yang mungkin belum ada pada bahasa pemrograman lainnya. Karena pada bahasa pemrograman / jenis Stack aplikasi lainnya, tanggung jawab ini diserahkan kepada entity Stack yang lain di dalam ekosistem, sehingga Stack yang dibangun menjadi kompleks. Contohnya adalah pada stack django python yang membutuhkan gunicorn untuk melakukan pengaturan terhadap proses worker, atau zookeeper pada java untuk menghadirkan fungsi Fault Tolerance, Service Discovery dan Cluster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hanya menulis kode “The Happy Path”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dengan semua filosofi yang ingin dibangun oleh pengembang Erlang/Elixir ini apakah tujuan besarnya ? Tujuannya adalah “Programmer Happiness”, semuanya adalah demi kebahagian programmer Erlang/Elixir. Kebahagian dalam arti programmer hanya diperlukan menulis bagian kode “The Happy Path”, bagian kode “The Sad Path” seperti Error, sebagian besarnya dapat dihapus dari baris kode. Impact atau pengaruhnya adalah kode yang bersih, jelas dan hanya berisikan logika aplikasi, jikapun ada Error Handling, itu hanya merupakan bagian dari logika aplikasi, seperti Error pada input pengguna yang perlu ditangani.&lt;/p&gt;

&lt;p&gt;“The Happy Path” pun tidak hanya berlaku bagi programmer, tetapi bagi tim yang menangani infrastruktur, akan terdampak juga. Karena stack aplikasi yang dibutuhkan menjadi lebih sederhana dan berkurang kompleksitasnya. Sebagai contoh seperti Whatsapp yang memiliki aplikasi yang diakses dengan jutaan pengguna, hanya dibutuhkan sekitar 50 orang engineer untuk menanganinya.&lt;/p&gt;

&lt;p&gt;Demikian sedikit penjelasan tentang filosofi “Let It CRASH!” pada Erlang/Elixir. Lebih lanjut tentang Supervisor bisa dilihat di &lt;a href="https://code.tutsplus.com/id/articles/supervisors-in-elixir--cms-29330"&gt;https://code.tutsplus.com/id/articles/supervisors-in-elixir--cms-29330&lt;/a&gt; . Terima kasih dan semoga bermanfaat.&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>erlang</category>
      <category>supervisor</category>
      <category>faulttolerance</category>
    </item>
    <item>
      <title>Mengenal Pemrograman Konkurensi pada Bahasa Pemrograman Elixir</title>
      <dc:creator>Iskandar Rizki</dc:creator>
      <pubDate>Fri, 08 May 2020 15:40:09 +0000</pubDate>
      <link>https://dev.to/rizki96/mengenal-pemrograman-konkurensi-pada-bahasa-pemrograman-elixir-2959</link>
      <guid>https://dev.to/rizki96/mengenal-pemrograman-konkurensi-pada-bahasa-pemrograman-elixir-2959</guid>
      <description>&lt;p&gt;Dalam membangun sebuah aplikasi yang di dalamnya ada aktivitas pemrograman, terkadang kita dihadapkan pada situasi dimana dibutuhkan performansi dalam menjalankan proses-proses di dalam kode yang ditulis.&lt;/p&gt;

&lt;p&gt;Untuk mencapai performansi yang memuaskan, dibutuhkan penggunaan resource seperti CPU dan memory yang maksimal dengan dijembatani oleh fasilitas yang terdapat dalam bahasa pemrograman.&lt;/p&gt;

&lt;p&gt;Tak berbeda juga dengan bahasa pemrograman lain, Elixir yang berjalan diatas Erlang Virtual Machine (BEAM) ini memiliki berbagai fitur untuk melakukan pemrograman konkurensi atau concurrent programming, sehingga proses-proses yang berjalan diatas BEAM ini dapat memaksimalkan kerja CPU dan memory melalui pemrograman pada bahasa Elixir.&lt;/p&gt;

&lt;p&gt;Hal yang membedakan pemrograman lain dan Elixir dalam pemrograman konkurensinya, Elixir memiliki konsep konkurensi berbasiskan Aktor (Actor Based Concurrency). Hal ini diturunkan dari bahasa pendahulunya yaitu Erlang. Erlang sendiri dikembangkan oleh Erricsson dan banyak digunakan untuk aplikasi telekomuniksi di seluruh dunia.&lt;/p&gt;

&lt;p&gt;Dalam konkurensi berbasiskan Aktor, ada 3 hal yang penting untuk dilibatkan dalam jalannya program. Pertama adalah Aktor yang melakukan sebuah pekerjaan (actor), kedua adalah pekerjaan itu sendiri (process), dan terakhir adalah pesan yang dipertukarkan antar Aktor (message passing).&lt;/p&gt;

&lt;p&gt;Kenapa ilustrasi Aktor diatas sangat penting dijabarkan dalam sebuah konsep pemrograman konkurensi ? Karena pada kenyataanya di bahasa pemrograman lain umumnya banyak yang terjerumus pada kompleksitas implementasi pemrograman konkurensi ini, yang disebabkan saling tumpang tindih, dan terjadi konflik dalam pemanfaatan resource memory dan IO (Disk, Network). Yang kemudian akan mengakibatkan jalannya program diluar harapan bahkan terjadi crash pada program.&lt;/p&gt;

&lt;p&gt;Dengan konsep Aktor ini, masing-masing Aktor tersebut memiliki resource komputasi CPU dan memory secara terpisah, tidak ada lagi saling tumpang tindih, dan terjadi konflik penggunaan resource memory dan IO. Sehingga semua Aktor akan berjalan secara bersamaan menjalankan proses yang hanya Aktor tersebut eksklusif mengetahuinya, dan hanya akan berkomunikasi melalui penukaran pesan, tanpa saling berbagi alamat memory sebagai sebab konflik resource yang telah dijelaskan sebelumnya.&lt;/p&gt;

&lt;p&gt;Ketika sebuah aktor sudah dinyatakan “hidup” dan siap menerima pesan, maka Aktor tersebut akan memiliki PID (Process ID). PID tersebut adalah sebuah alamat kirim mengirim pesan (message passing) antar Aktor.&lt;/p&gt;

&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
Ilustrasi sebuah agent yang berupa Aktor, dimana memiliki alamat PID, kemudian dikirimkan pesan “update” dan “get”, yang pada akhirnya diperintahkan untuk “stop”



&lt;p&gt;Dan apabila sebuah Aktor, katakan Aktor A menginginkan Aktor lain untuk melakukan perhitungan, misalnya Aktor B, maka yang diperlukan hanya pengiriman pesan (message passing) dari Aktor A ke PID Aktor B yang menjalankan proses perhitungan tersebut.&lt;/p&gt;

&lt;p&gt;Setiap pesan yang dikirim akan diterima oleh Aktor tadi di dalam sebuah Mailbox. Mailbox ini berupa antrian pesan, jika satu pesan berisi perintah untuk menjalankan proses perhitungan dan proses telah berhasil dijalankan maka akan diambil pesan berikutnya pada Mailbox, untuk kemudian dijalankan isi perintah dalam pesan tersebut, begitu seterusnya.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LZI9nRTH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/34tk9g8vw7e1un4u4t2q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LZI9nRTH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/34tk9g8vw7e1un4u4t2q.jpg" alt="Alt Text"&gt;&lt;/a&gt;Ilustrasi Aktor yang saling mengirimkan pesan, dalam masing-masing Aktor tersebut memiliki resource CPU dan memory secara terpisah, dan menjalankan proses secara eksklusif&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mbY3SBiE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dl42qx87n9hqoxuxfkvc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mbY3SBiE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dl42qx87n9hqoxuxfkvc.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Ilustrasi Aktor, PID, Pesan dan Mailbox (diambil dari &lt;a href="https://learnyousomeerlang.com/the-hitchhikers-guide-to-concurrency"&gt;https://learnyousomeerlang.com/the-hitchhikers-guide-to-concurrency&lt;/a&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Aktor A yang sebelumnya mengirimkan pesan, memiliki 2 pilihan, yaitu menunggu hasil proses perhitungan, sehingga nilai dari perhitungan tadi dapat digunakan oleh Aktor A, atau mengabaikan semua hasil perhitungan, dan membiarkan Aktor B yang mengurus semua hasil perhitungan (misalnya dengan disimpan ke database atau lainnya).&lt;/p&gt;

&lt;p&gt;Pada suatu aplikasi yang menjalankan BEAM ini, memiliki ribuan, ratusan ribu bahkan jutaan Aktor adalah hal yang biasa. Sehingga aplikasi seperti Whatsapp yang dibangun diatas BEAM dengan bahasa Erlang dapat melayani miliaran pesan dalam suatu waktu.&lt;/p&gt;

&lt;p&gt;Keuntungan lain dari Aktor ini adalah skalabilitas di level jaringan, dimana antar Aktor ini bisa saling berkomunikasi tidak hanya di level satu aplikasi, tapi juga bisa saling berkomunikasi atau berkirim pesan antar mesin di dalam suatu jaringan. Dari sisi kode yang dibangun, keuntungan yang didapatkan adalah pengembang akan fokus terhadap logika aplikasi yang dibangun, tanpa ada gangguan dari kode-kode yang berhubungan dengan saling tumpang tindih resource dan kode-kode untuk menghindari konflik resource memory dan IO.&lt;/p&gt;

&lt;p&gt;Sisi negatif dari Aktor ini adalah penggunaan memory yang relatif lebih besar dibandingkan solusi konkurensi pada bahasa pemrograman lainnya. Dan untuk mendapatkan performansi kecepatan secara kasar (yang tidak menggunakan proteksi di memory) aplikasi Elixir sulit untuk dicapai, dimana BEAM telah memproteksi semua jalannya Aktor agar stabil dalam penggunaan memory, sehingga memiliki trade off atau harga yang dibayar dengan kecepatan dan besarnya memory untuk kestabilan sistem aplikasi.&lt;/p&gt;

&lt;p&gt;Demikian sekilas konsep konkurensi berbasis Aktor pada bahasa pemrograman Elixir, untuk sumber pengetahuan lebih lanjut mengenai bahasa pemrograman Elixir, silahkan kunjungi &lt;a href="https://elixirschool.com/id/"&gt;https://elixirschool.com/id/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>erlang</category>
      <category>elixir</category>
      <category>concurrentprogramming</category>
      <category>beam</category>
    </item>
  </channel>
</rss>
