<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="id">
  <title>Kumpulan Catatan Riza Fahmi (Full)</title>
  <subtitle>Feed Atom dengan konten lengkap untuk setiap tulisan.</subtitle>
  <link href="https://rizafahmi.com/feed/full.xml" rel="self"/>
  <link href="https://rizafahmi.com/"/>
  <updated>2026-03-09T02:00:05Z</updated>
  <id>https://rizafahmi.com/</id>
  <author>
    <name>Riza Fahmi</name>
    <email>rizafahmi@gmail.com</email>
  </author>
  <generator>Eleventy</generator>
  
  <entry>
    <title>Fondasi Agentic Coding - Integrasi LLM</title>
    <link href="https://rizafahmi.com/catatan/agentic-coding-bag-2/"/>
    <updated>2026-02-08T00:00:00Z</updated>
    <pubDate>2026-02-08T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/catatan/agentic-coding-bag-2/</id>
    <summary>Seri Agentic Coding Fondasi Agentic Coding - Apa itu Agent? ➡️ Fondasi Agentic Coding - Integrasi LLM Setelah membedah konsep AI Agent di bagian pertama , kini saatnya kita mempraktikkan teori dalam barisan kode. Kita…</summary>
    <category term="catatan"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/agentic-coding-bag-2.png"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Seri Agentic Coding&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/agentic-coding&quot;&gt;Fondasi Agentic Coding - Apa itu Agent?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;➡️ Fondasi Agentic Coding - Integrasi LLM&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;Setelah membedah konsep AI Agent di &lt;a href=&quot;https://rizafahmi.com/catatan/agentic-coding&quot;&gt;bagian pertama&lt;/a&gt;, kini saatnya kita mempraktikkan teori dalam barisan kode. Kita akan membangun &lt;code&gt;mbb&lt;/code&gt;, sebuah aplikasi CLI fungsional menggunakan Elixir, bahasa yang sangat ideal untuk Agentic AI karena kemampuan konkurensi dan fault tolerance.
Kita akan belajar langkah demi langkah cara memanggil LLM melalui REST API dan menterjemahkan responsnya agar bisa dipahami oleh pengguna.&lt;/p&gt;
&lt;p&gt;Sedikit demi sedikit kita akan mengembangkan mbb mulai nol sampai menjadi agentic coding sederhana.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;quot;Perjalanan membangun AI agent dimulai dengan satu API call.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Berikut adalah cuplikan aplikasi yang akan kita kembangkan di artikel ini. Setelah membaca artikel ini, kita akan sama-sama belajar bagaimana memanggil LLM lewat REST API dan menterjemahkan respons.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://rizafahmi.com/assets/images/agentic/demo-opt.mp4&quot; autoplay=&quot;&quot; loop=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h2&gt;Persiapan Proyek&lt;/h2&gt;
&lt;p&gt;Kita akan membangun aplikasi mbb ini dengan Elixir. Elixir adalah bahasa pemrograman fungsional yang elegan. Jika teman-teman ingin melihat implementasi dengan bahasa lain boleh tulis di kolom komentar.&lt;/p&gt;
&lt;p&gt;Pertama, buat proyeknya dulu dengan &lt;code&gt;mix&lt;/code&gt; dan jalankan &lt;code&gt;mix test&lt;/code&gt; untuk memastikan semuanya berjalan sesuai harapan.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;mix&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; mbb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; mbb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;mix&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; test&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Compiling 1 file (.ex)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Generated mbb app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;..&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Finished in 0.03 seconds (0.03s async, 0.00s sync)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1 doctest, 1 test, 0 failures&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Konfigurasi aplikasi CLI dengan Escript&lt;/h3&gt;
&lt;p&gt;Agar aplikasi kita bisa dijalankan dari command line, kita akan mengemasnya sebagai escript. Tambahkan konfigurasi escript di dalam &lt;code&gt;mix.exs&lt;/code&gt;. Escript melakukan kompilasi seluruh kode Elixir beserta pustaka tambahan menjadi satu file binary mandiri. Ini memudahkan distribusi aplikasi. Pengguna hanya memerlukan Erlang Runtime (ERTS) di sistem mereka tanpa harus mengunduh source code atau menjalankan mix secara manual.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;mix.exs&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# kode lainnya...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; project&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    # kode lainnya...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    escript: [main_module: &lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Mbb&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# kode lainnya...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Di kode ini kita mengarahkan escript untuk menggunakan modul &lt;code&gt;Mbb&lt;/code&gt; sebagai pintu masuk utama aplikasi kita. Nantinya, fungsi &lt;code&gt;main/1&lt;/code&gt; di dalam modul &lt;code&gt;Mbb&lt;/code&gt; akan otomatis dieksekusi saat kita menjalankan file escript yang sudah dibangun.&lt;/p&gt;
&lt;p&gt;Berikutnya, kita akan menulis fungsi &lt;code&gt;main/1&lt;/code&gt; di dalam modul &lt;code&gt;Mbb&lt;/code&gt; untuk menampilkan pesan legendaris &amp;quot;Hello, world!&amp;quot; saat aplikasi dijalankan dari command line.&lt;/p&gt;
&lt;h3&gt;Menampilkan pesan legendaris&lt;/h3&gt;
&lt;p&gt;Sekarang kita akan menambahkan fungsi &lt;code&gt;main/1&lt;/code&gt; di dalam modul &lt;code&gt;Mbb&lt;/code&gt; untuk menampilkan pesan legendaris &amp;quot;Hello, world!&amp;quot; saat aplikasi dijalankan dari command line.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;lib/mbb.ex&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;defmodule&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Mbb&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;_args&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;    IO&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;puts&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Hello, world!&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jalankan perintah berikut untuk membangun escript dan menjalankannya.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;mix&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; escript.build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;./mbb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tentu saja akan muncul pesan &amp;quot;Hello, world!&amp;quot; di terminal.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Hello, world!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Berhubung kita akan kita akan menggunakan argumen untuk mengirim instruksi ke LLM nanti, ubah sedikit fungsi &lt;code&gt;main/1&lt;/code&gt; agar menampilkan argumen yang diterima. Dan apabila tidak ada argumen, tampilkan cara penggunaan aplikasi.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;lib/mbb.ex&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;defmodule&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Mbb&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([question]) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;    IO&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;puts&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Hello, &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;#{&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;question&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;!&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([]) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;    IO&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;puts&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Usage: ./mbb &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;&#92;&quot;&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#x3C;your question&gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;&#92;&quot;&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kode diatas mendemonstrasikan penggunaan &lt;em&gt;pattern matching&lt;/em&gt; di Elixir, salah satu fitur menarik dari bahasa ini. Meski memiliki nama yang sama, fungsi &lt;code&gt;main/1&lt;/code&gt; memiliki dua definisi fungsi yang berbeda. Elixir akan otomatis memilih definisi mana yang cocok berdasarkan struktur argumen yang diterima. Jika argumen berupa list/array dengan satu elemen &lt;code&gt;[question]&lt;/code&gt;, definisi pertama yang akan dieksekusi. Jika list kosong &lt;code&gt;[]&lt;/code&gt;, definisi kedua dipanggil. Ini membuat kode lebih deklaratif dibanding menggunakan &lt;code&gt;if/else&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Jalankan kembali escript-nya dengan argumen.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;mix&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; escript.build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;./mbb&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;Elixir&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hasilnya, tentu saja akan menampilkan:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Hello, Elixir!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sedangkan apabila program dijalankan tanpa memberikan argumen tambahan, maka akan menampilkan pesan penggunaan.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;./mbb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Usage: ./mbb &quot;&amp;#x3C;your question&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Berikutnya kita akan mengganti pesan &amp;quot;Hello, &lt;question&gt;!&amp;quot; dengan respons dari LLM. Tapi sebelum itu, kita perlu menambahkan pustaka HTTP client untuk memanggil REST API terlebih dahulu.&lt;/question&gt;&lt;/p&gt;
&lt;h2&gt;Memanggil LLM dengan REST API&lt;/h2&gt;
&lt;h3&gt;Menambahkan Pustaka Req&lt;/h3&gt;
&lt;p&gt;Untuk berinteraksi dengan LLM, kita akan menggunakan pendekatan REST API. Selain lebih familiar bagi sebagian besar teman-teman developer, cara ini bersifat lebih agnostik dan tidak mengikat kita dibandingkan menggunakan pustak atau SDK pihak ketiga tertentu. Hari ini Gemini, besok bisa Claude atau GPT-5 dengan perubahan minimal.&lt;/p&gt;
&lt;p&gt;Untuk menangani pemanggilan REST API, kita akan menggunakan pustaka &lt;code&gt;Req&lt;/code&gt;. &lt;code&gt;Req&lt;/code&gt; adalah HTTP client Elixir modern dengan penggunaan yang lebih sederhana. Alternatif lain ada HTTPoison yang lebih &lt;em&gt;mature&lt;/em&gt; tapi &lt;em&gt;verbose&lt;/em&gt; atau Finch yang lebih &lt;em&gt;low-level&lt;/em&gt;. Req cocok untuk proyek ini karena sederhana penggunaannya dibandingkan pustaka lain. Req juga mendukung &lt;code&gt;retry&lt;/code&gt; otomatis, konfigurasi timeout, dan sudah dilengkapi dengan penanganan format JSON, yang akan berguna sepanjang pengembangan aplikasi.&lt;/p&gt;
&lt;p&gt;Buka &lt;code&gt;mix.exs&lt;/code&gt; dan tambahkan &lt;code&gt;:req&lt;/code&gt; di dalam daftar dependensi.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;mix.exs&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# kode lainnya...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;defp&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; deps&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {:req, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;&gt;= 0.0.0&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kode diatas memberitahu Elixir bahwa kita ingin menggunakan pustaka &lt;code&gt;Req&lt;/code&gt; dengan versi berapa pun yang tersedia.&lt;/p&gt;
&lt;p&gt;Setelah itu jalankan &lt;code&gt;mix deps.get&lt;/code&gt; untuk mengunduh dependensi yang baru ditambahkan. Dan kita siap untuk memanggil LLM lewat REST API.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;mix&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; deps.get&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Resolving Hex dependencies...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Resolution completed in 0.05s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;New:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  req 0.5.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;* Getting req (Hex package)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Membuat Panggilan API Perdana&lt;/h3&gt;
&lt;p&gt;Kali ini kita akan menggunakan model Gemini dari Google. Tenang saja, semua konsep yang kita bahas di sini bisa diterapkan ke model lain seperti Claude, GPT-5, atau lainnya. Hanya berbeda di endpoint, data yang dikirim dan data yang diterima.&lt;/p&gt;
&lt;p&gt;Sebelum kita mengirim permintaan ke API, kita perlu mendapatkan API key dari penyedia layanan LLM. Saya contohkan menggunakan &lt;a href=&quot;https://aistudio.google.com/&quot;&gt;AIStudio&lt;/a&gt; dari Google. Silakan daftar dan dapatkan API key-nya. Tenang saja, ada &lt;em&gt;free tier&lt;/em&gt;-nya kok sehingga tidak perlu mengeluarkan biaya.&lt;/p&gt;
&lt;p&gt;Setelah mendapatkan API key, simpan di file &lt;code&gt;.env&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;.env&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; API_KEY&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;sk-...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lalu aktivasi dengan menjalankan:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; .env&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Perintah diatas akan menambahkan variabel &lt;code&gt;API_KEY&lt;/code&gt; ke dalam environment sehingga bisa diakses oleh aplikasi kita. Tidak semua sistem operasi dapat menjalankan perintah &lt;code&gt;source&lt;/code&gt;, jadi pastikan untuk menyesuaikan dengan sistem operasi yang digunakan. Sistem operasi Linux dan macOS biasanya mendukung perintah &lt;code&gt;source&lt;/code&gt;, sedangkan di Windows, Anda mungkin perlu menggunakan &lt;code&gt;set&lt;/code&gt; atau &lt;code&gt;setx&lt;/code&gt; untuk mengatur environment variable.&lt;/p&gt;
&lt;p&gt;Jangan lupa untuk menambahkan file &lt;code&gt;.env&lt;/code&gt; ke dalam &lt;code&gt;.gitignore&lt;/code&gt; untuk mencegah kebocoran data rahasia ke repositori publik.&lt;/p&gt;
&lt;p&gt;Sekarang bagian yang seru. Ubah file &lt;code&gt;lib/mbb.ex&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;lib/mbb.ex&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;defmodule&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Mbb&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  @model&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;gemini-3-flash-preview&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  @system_prompt&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;You are a helpful assistant.&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([question]) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {:ok, response} = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(question)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;    IO&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;puts&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(response)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([]) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;    IO&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;puts&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Usage: ./mbb &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;&#92;&quot;&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#x3C;your question&gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;&#92;&quot;&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; call&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(message) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    api_key = &lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;System&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;fetch_env!&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;API_KEY&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    url = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;api_url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(api_key)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    body = %{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      system_instruction: %{parts: [%{text: &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;@system_prompt&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}]},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      contents: [%{role: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, parts: [%{text: message}]}],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      generationConfig: %{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        maxOutputTokens: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1_000&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        temperature: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        thinkingConfig: %{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;          thinkingLevel: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;MEDIUM&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    case&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Req&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(url, json: body) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      {:ok, %{status: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, body: body}} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;        parse_response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(body)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      {:ok, %{status: status, body: body}} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        {:error, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;API error &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;#{&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;#{&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;inspect&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(body)&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      {:error, reason} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        {:error, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Request failed: &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;#{&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;inspect&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(reason)&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  defp&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; api_url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(api_key) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;    &quot;https://generativelanguage.googleapis.com/v1beta/models/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;#{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;@model&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;:generateContent?key=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;#{&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;api_key&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  defp&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; parse_response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(%{&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;candidates&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&gt; [%{&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&gt; %{&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;parts&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&gt; [%{&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&gt; text}]}} | &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;_&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]}) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {:ok, text}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  defp&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; parse_response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(body) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {:error, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Unexpected response format: &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;#{&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;inspect&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(body)&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fungsi &lt;code&gt;call/1&lt;/code&gt; di atas bertanggung jawab untuk membangun permintaan API, mengirimkannya, dan menangani respons yang diterima. Kita menggunakan &lt;code&gt;Req.post/2&lt;/code&gt; untuk mengirim permintaan POST ke endpoint API Gemini dengan payload yang sudah kita siapkan. Jika permintaan berhasil, kita akan memanggil fungsi &lt;code&gt;parse_response/1&lt;/code&gt; untuk mengekstrak teks jawaban dari respons API. Jika terjadi kesalahan, kita akan mengembalikan pesan kesalahan.&lt;/p&gt;
&lt;p&gt;Sedangkan untuk konfigurasi LLM, kita mengatur &lt;code&gt;thinkingLevel&lt;/code&gt; menjadi &amp;quot;MEDIUM&amp;quot; yang memungkinkan model melakukan penalaran internal sebelum memberikan jawaban. Ini bisa membantu menghasilkan jawaban yang lebih baik untuk pertanyaan yang kompleks. &lt;code&gt;temperature&lt;/code&gt; diatur ke 0.0 untuk memastikan jawaban yang lebih konsisten. Sedangkan &lt;code&gt;maxOutputTokens&lt;/code&gt; diatur ke 1.000 untuk memberikan ruang yang cukup bagi model untuk menghasilkan jawaban yang panjang jika diperlukan. Teman-teman bebas mengubah konfigurasi ini sesuai kebutuhan. Konfigurasi yang saya gunakan hanya sebagai contoh untuk memulai.&lt;/p&gt;
&lt;p&gt;Lakukan kompilasi ulang dan coba jalankan programnya.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;mix&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; escript.build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;./mbb&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;Tanggal dan jam berapa sekarang?&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Sekarang adalah hari **Rabu, 22 Mei 2024**.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Waktu saat ini menunjukkan pukul **08:44**.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Seperti model bahasa besar lainnya, Gemini masih mengalami halusinasi jika ditanya sesuatu yang sifatnya data terkini. Lain halnya jika pertanyaan berkaitan dengan pengetahuan umum yang sudah masuk ke dalam data latihannya.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;./mbb&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;Mengapa bahasa fungsional lebih unggul dibandingkan paradigma lain?&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-md&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;Menyebut bahasa fungsional (seperti Haskell, Elixir, Scala, atau Clojure) &quot;lebih unggul&quot; mungkin subjektif, namun paradigma &lt;/span&gt;&lt;span style=&quot;color:#569CD6;font-weight:bold&quot;&gt;**Functional Programming (FP)**&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; memang memiliki keunggulan teknis yang sangat signifikan dibandingkan paradigma &lt;/span&gt;&lt;span style=&quot;color:#569CD6;font-weight:bold&quot;&gt;**Imperatif**&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; atau &lt;/span&gt;&lt;span style=&quot;color:#569CD6;font-weight:bold&quot;&gt;**Object-Oriented (OO)**&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, terutama dalam konteks pengembangan perangkat lunak modern yang kompleks.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;Berikut adalah alasan mengapa paradigma fungsional dianggap lebih unggul dalam banyak aspek:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6;font-weight:bold&quot;&gt;### 1. Immutability (Kekekalan Data)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;Dalam FP, data bersifat &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4;font-style:italic&quot;&gt;*immutable*&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (tidak dapat diubah setelah dibuat). Jika Anda ingin mengubah nilai, Anda membuat data baru, bukan memodifikasi yang lama.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6796E6&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#569CD6;font-weight:bold&quot;&gt;   **Keunggulan:**&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; Ini menghilangkan bug yang disebabkan oleh perubahan status (&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4;font-style:italic&quot;&gt;*state*&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) yang tidak terduga. Anda tidak perlu khawatir variabel &quot;A&quot; tiba-tiba berubah nilainya di tengah eksekusi karena dipengaruhi oleh fungsi lain.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6;font-weight:bold&quot;&gt;### 2. Pure Functions (Fungsi Murni)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;Fungsi murni adalah fungsi yang:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6796E6&quot;&gt;1.&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; Menghasilkan output yang sama untuk input yang sama.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6796E6&quot;&gt;2.&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; Tidak memiliki &lt;/span&gt;&lt;span style=&quot;color:#569CD6;font-weight:bold&quot;&gt;**Side Effects**&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (tidak mengubah variabel global, tidak menulis ke database, dll. secara tersembunyi).&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6796E6&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#569CD6;font-weight:bold&quot;&gt;   **Keunggulan:**&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; Kode menjadi sangat mudah diprediksi, diuji (&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4;font-style:italic&quot;&gt;*unit testing*&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;), dan di-&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4;font-style:italic&quot;&gt;*debug*&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;. Anda cukup melihat input dan output tanpa harus melacak status seluruh aplikasi.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6;font-weight:bold&quot;&gt;### 3. Kemudahan Concurrency dan Parallelism&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;Ini adalah alasan utama mengapa FP populer di era prosesor multi-core. Dalam paradigma OO, menjalankan banyak &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4;font-style:italic&quot;&gt;*thread*&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; secara bersamaan sangat sulit karena adanya &quot;Shared State&quot; (data yang diakses bersama), yang sering menyebabkan &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4;font-style:italic&quot;&gt;*race conditions*&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6796E6&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#569CD6;font-weight:bold&quot;&gt;   **Keunggulan:**&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; Karena data dalam FP bersifat &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4;font-style:italic&quot;&gt;*immutable*&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, tidak ada risiko dua &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4;font-style:italic&quot;&gt;*thread*&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; mengubah data yang&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Selamat! Kita sudah berhasil memanggil API pertama ke Gemini. Berikutnya kita akan mengintip sedikit ke dalam respons API untuk memahami data apa saja yang kita dapatkan selain jawaban teks sehingga nantinya bisa kita manfaatkan untuk mengembangkan program kita lebih lanjut.&lt;/p&gt;
&lt;h2&gt;Anatomi Respons API&lt;/h2&gt;
&lt;p&gt;Biasanya LLM seperti Gemini tidak hanya mengirimkan jawaban teks. API biasanya juga menyertakan metadata penting, seperti jumlah token dan alasan mengapa model berhenti menghasilkan teks, yang krusial untuk pemantauan biaya serta performa aplikasi.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;candidates&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      &quot;content&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        &quot;parts&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;          {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            &quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Saat ini adalah hari **Kamis, 23 Mei 2024**. &lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;&#92;n&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;Waktu menunjukkan pukul **08:14** WIB (Waktu Indonesia Barat).&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            &quot;thoughtSignature&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;EswHCskHAb...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;          }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        &quot;role&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      &quot;finishReason&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;STOP&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      &quot;index&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;usageMetadata&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    &quot;promptTokenCount&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    &quot;candidatesTokenCount&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;38&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    &quot;totalTokenCount&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;329&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    &quot;promptTokensDetails&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        &quot;modality&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;TEXT&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        &quot;tokenCount&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    &quot;thoughtsTokenCount&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;284&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;modelVersion&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;gemini-3-flash-preview&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;responseId&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;DR-PaZOINuX94-EPjqGjuQg&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Memahami struktur JSON ini krusial untuk pengembangan lebih lanjut:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;content&lt;/code&gt;: Objek yang berisi array. Ada respons dari LLM, tool_use untuk dibahas artikel berikutnya.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;finishReason&lt;/code&gt;: Alasan model berhenti. &lt;code&gt;STOP&lt;/code&gt; berarti selesai secara normal, sementara &lt;code&gt;MAX_TOKEN&lt;/code&gt; menandakan jawaban terpotong karena &lt;em&gt;rate limit&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;totalTokenCount&lt;/code&gt;: Total konsumsi token keseluruhan, input dan output. Perhatikan bagian &lt;code&gt;thoughtsTokenCount&lt;/code&gt; karena kita mengaktifkan &lt;code&gt;thinkingLevel: &amp;quot;MEDIUM&amp;quot;&lt;/code&gt; di konfigurasi, yang memungkinkan model melakukan penalaran internal sebelum menjawab.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Setelah kita memahami apa yang API kirimkan, mari kita pastikan aplikasi kita handle error dengan graceful ketika sesuatu tidak berjalan sesuai rencana.&amp;quot;&lt;/p&gt;
&lt;p&gt;Bagian berikutnya kita akan menangani lebih lanjut kesalahan yang mungkin terjadi saat memanggil API, seperti API_KEY yang tidak ditemukan, input yang tidak valid, atau error dari sisi server penyedia LLM.&lt;/p&gt;
&lt;h2&gt;Menangani Kesalahan&lt;/h2&gt;
&lt;h3&gt;Validasi &lt;code&gt;API_KEY&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Meskipun kode awal sudah memiliki penanganan kesalahan dasar, aplikasi yang kokoh membutuhkan respons yang lebih informatif. Mari kita tingkatkan pengalaman pengguna dengan membuat pesan kesalahan yang lebih &amp;quot;manusiawi&amp;quot;, terutama saat variabel &lt;code&gt;API_KEY&lt;/code&gt; belum ditemukan.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;** (System.EnvError) could not fetch environment variable &quot;API_KEY&quot; because it is not set&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    (elixir 1.18.4) lib/system.ex:705: System.fetch_env!/1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    (mbb 0.1.0) lib/mbb.ex:17: Mbb.call/1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    (mbb 0.1.0) lib/mbb.ex:6: Mbb.main/1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    (elixir 1.18.4) lib/kernel/cli.ex:137: anonymous fn/3 in Kernel.CLI.exec_fun/2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kita akan ganti dengan pesan kurang lebih seperti berikut:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;API_KEY tidak ditemukan. Jalankan: export API_KEY=&#92;&quot;AIsKantT...&#92;&quot; terlebih dahulu sebelum menjalankan ./mbb.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;lib/mbb.ex&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;defmodule Mbb do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   @model &quot;gemini-3-flash-preview&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   @system_prompt &quot;You are a helpful assistant.&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   def main([question]) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-    {:ok, response} = call(question)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-    IO.puts(response)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    case call(question) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      {:ok, response} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+        IO.puts(response)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      {:error, reason} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+        IO.puts(reason)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   def main([]) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     IO.puts(&quot;Usage: ./mbb &#92;&quot;&amp;#x3C;your question&gt;&#92;&quot;&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   def call(message) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-    api_key = System.fetch_env!(&quot;API_KEY&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    api_key = System.get_env(&quot;API_KEY&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    cond do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      is_nil(api_key) or api_key == &quot;&quot; -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+        {:error,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+         &quot;API_KEY tidak ditemukan. Jalankan: export API_KEY=&#92;&quot;AIsKantT...&#92;&quot; terlebih dahulu sebelum menjalankan ./mbb.&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      true -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+        do_call(api_key, message)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  defp do_call(api_key, message) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    url = api_url(api_key)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    body = %{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      system_instruction: %{parts: [%{text: @system_prompt}]},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      contents: [%{role: &quot;user&quot;, parts: [%{text: message}]}],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      generationConfig: %{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        maxOutputTokens: 1_000,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        temperature: 0.0,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        thinkingConfig: %{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;          thinkingLevel: &quot;MEDIUM&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    case Req.post(url, json: body) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      {:ok, %{status: 200, body: body}} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        parse_response(body)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      {:ok, %{status: status, body: body}} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        {:error, &quot;API error #{status}: #{inspect(body)}&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      {:error, reason} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        {:error, &quot;Request failed: #{inspect(reason)}&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  # Kode lainnya...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kita mengganti penggunaan &lt;code&gt;System.fetch_env!/1&lt;/code&gt; dengan &lt;code&gt;System.get_env/1&lt;/code&gt; yang tidak akan melempar error jika environment variable tidak ditemukan. Sebagai gantinya, kita melakukan pengecekan manual untuk memastikan &lt;code&gt;API_KEY&lt;/code&gt; ada dan tidak kosong. Jika tidak ditemukan, kita mengembalikan format &lt;code&gt;{:error, reason}&lt;/code&gt; lalu menampilkan pesan kesalahan yang lebih informatif kepada pengguna.&lt;/p&gt;
&lt;p&gt;Sekarang apabila dijalankan tanpa setup &lt;code&gt;API_KEY&lt;/code&gt; terlebih dahulu, akan menghasilkan pesan kesalahan seperti berikut:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;mix&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; escript.build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;./mbb&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;Tanggal dan jam berapa sekarang?&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;API_KEY tidak ditemukan. Jalankan: export API_KEY=&quot;AIsKantT...&quot; terlebih dahulu sebelum menjalankan ./mbb.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Validasi input&lt;/h3&gt;
&lt;p&gt;Berikutnya kita akan menangani input dari pengguna. Jika instruksi atau pertanyaan kosong atau hanya berisi spasi, sebaiknya tidak perlu dikirimkan ke LLM. Selain tidak ada gunanya, juga bisa menghemat token.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;lib/mbb.ex&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; defmodule Mbb do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   @model &quot;gemini-3-flash-preview&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   @system_prompt &quot;You are a helpful assistant.&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  @help_message &quot;Usage: ./mbb &#92;&quot;&amp;#x3C;your question&gt;&#92;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   def main([question]) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     case call(question) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       {:ok, response} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;         IO.puts(response)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       {:error, reason} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;         IO.puts(reason)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   def main([]) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-    IO.puts(&quot;Usage: ./mbb &#92;&quot;&amp;#x3C;your question&gt;&#92;&quot;&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    IO.puts(@help_message)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   def call(message) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     api_key = System.get_env(&quot;API_KEY&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     cond do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       is_nil(api_key) or api_key == &quot;&quot; -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;         {:error,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;          &quot;API_KEY tidak ditemukan. Jalankan: export API_KEY=&#92;&quot;AIsKantT...&#92;&quot; terlebih dahulu sebelum menjalankan ./mbb.&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      String.trim(message) == &quot;&quot; -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+        {:error, @help_message}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       true -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;         do_call(api_key, message)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   # Kode lainnya...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pertama, kita menambahkan variabel &lt;code&gt;@help_message&lt;/code&gt; untuk menyimpan pesan bantuan yang akan ditampilkan kepada pengguna sehingga dapat dipanggil berkali-kali tanpa harus menulis ulang string pesan bantuan. Kemudian, di dalam fungsi &lt;code&gt;call/1&lt;/code&gt;, kita menambahkan kondisi untuk memeriksa apakah input &lt;code&gt;message&lt;/code&gt; hanya berisi spasi atau kosong setelah dibersihkan dengan &lt;code&gt;String.trim/1&lt;/code&gt;. Jika kondisi ini terjadi, kita mengembalikan format &lt;code&gt;{:error, @help_message}&lt;/code&gt; yang akan menampilkan pesan bantuan kepada pengguna.&lt;/p&gt;
&lt;h3&gt;Validasi HTTP Error&lt;/h3&gt;
&lt;p&gt;Kita juga akan menangani beberapa HTTP error seperti 401 jika &lt;code&gt;API_KEY&lt;/code&gt; keliru, 429 jika kena &lt;em&gt;rate limit&lt;/em&gt;, 500 jika kesalahan terjadi di sisi server penyedia LLM, dan juga penanganan jika koneksi lambat, terputus dsb.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;lib/mbb.ex&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; defmodule Mbb do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   @model &quot;gemini-3-flash-preview&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   @system_prompt &quot;You are a helpful assistant.&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   @help_message &quot;Usage: ./mbb &#92;&quot;&amp;#x3C;your question&gt;&#92;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   # Kode lainnya...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   defp do_call(api_key, message) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     url = api_url(api_key)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     body = %{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       system_instruction: %{parts: [%{text: @system_prompt}]},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       contents: [%{role: &quot;user&quot;, parts: [%{text: message}]}],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       generationConfig: %{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;         maxOutputTokens: 1_000,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;         temperature: 0.0,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;         thinkingConfig: %{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;           thinkingLevel: &quot;MEDIUM&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;         }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     case Req.post(url, json: body) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       {:ok, %{status: 200, body: body}} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;         parse_response(body)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      {:ok, %{status: 401}} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+        {:error, &quot;401 Unauthorized: Periksa kembali API_KEY anda.&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      {:ok, %{status: 429}} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+        {:error, &quot;429 Rate Limit Exceeded: Tunggu beberapa menit, lalu coba lagi.&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      {:ok, %{status: 500}} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+        {:error, &quot;500 Server Error: Masalah di sisi LLM provider. Coba lagi dalam beberapa menit.&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       {:ok, %{status: status, body: body}} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-        {:error, &quot;API error #{status}: #{inspect(body)}&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+        {:error, &quot;API Error #{status}: #{get_error_message(body)}&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      {:error, %{reason: :timeout}} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+        {:error, &quot;Request timeout. Koneksi lambat atau terputus.&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       {:error, reason} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;         {:error, &quot;Request failed: #{inspect(reason)}&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  defp get_error_message(%{&quot;error&quot; =&gt; %{&quot;message&quot; =&gt; msg}}), do: msg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  defp get_error_message(body), do: inspect(body)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   defp api_url(api_key) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     &quot;https://generativelanguage.googleapis.com/v1beta/models/#{@model}:generateContent?key=#{api_key}&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pada potongan kode di atas, kita menambahkan beberapa pola pencocokan untuk menangani status HTTP yang umum terjadi saat memanggil API. Untuk setiap status error yang kita tangani, kita mengembalikan pesan kesalahan yang lebih spesifik dan informatif kepada pengguna. Selain itu, kita juga menambahkan penanganan untuk kasus timeout yang mungkin terjadi jika koneksi internet lambat atau terputus. Tentunya kita juga akan menampilkan pesan kesalahan lain yang tidak secara spesifik ditangani oleh kode kita.&lt;/p&gt;
&lt;p&gt;Bagian berikutnya kita akan menambahkan indikator status &amp;quot;Berpikir...&amp;quot; saat menunggu respons dari LLM, serta memberikan warna pada output untuk membedakan antara respons sukses dan pesan kesalahan.&lt;/p&gt;
&lt;h2&gt;Status Indikator&lt;/h2&gt;
&lt;p&gt;Sekarang kita akan menambahkan indikator &amp;quot;Berpikir...&amp;quot; supaya pengguna tidak kebingungan. Tambahkan warna juga sebagai indikator kesuksesan atau kesalahan.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;lib/mbb.ex&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; defmodule Mbb do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   @model &quot;gemini-3-flash-preview&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   @system_prompt &quot;You are a helpful assistant.&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-  @help_message &quot;Usage: ./mbb &#92;&quot;&amp;#x3C;your question&gt;&#92;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  # ANSI color codes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  @green &quot;&#92;e[32m&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  @red &quot;&#92;e[31m&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  @cyan &quot;&#92;e[36m&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  @reset &quot;&#92;e[0m&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   def main([question]) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    print_thinking()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     case call(question) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-      {:ok, response} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-        IO.puts(response)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      {:ok, text} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+        print_response(text)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       {:error, reason} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-        IO.puts(reason)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+        print_error(reason)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   def main([]) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-    IO.puts(@help_message)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    IO.puts(help_message())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; def call(message) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     api_key = System.get_env(&quot;API_KEY&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     cond do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       is_nil(api_key) or api_key == &quot;&quot; -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;         {:error,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;          &quot;API_KEY tidak ditemukan. Jalankan: export API_KEY=&#92;&quot;AIsKantT...&#92;&quot; terlebih dahulu sebelum menjalankan ./mbb.&quot;} &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       String.trim(message) == &quot;&quot; -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-        {:error, @help_message}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+        {:error, help_message()}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       true -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;         do_call(api_key, message)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   # Kode lainnya...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  defp print_thinking() do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    IO.write(&quot;#{@cyan}🤖 Sedang berpikir...#{@reset}&#92;r&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  defp print_response(text) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    IO.write(&quot;&#92;e[2K&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    IO.puts(&quot;#{@green}#{text}#{@reset}&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  defp print_error(reason) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    IO.write(&quot;&#92;e[2K&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    IO.puts(&quot;#{@red}❌ #{reason}#{@reset}&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  defp help_message() do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    &quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    #{@cyan}mbb#{@reset} - AI Coding Agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    Usage:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      ./mbb &quot;pertanyaan atau instruksi&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    Examples:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      ./mbb &quot;Apa itu recursion?&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      ./mbb &quot;Jelaskan pattern matching di Elixir&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    &quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   defp get_error_message(%{&quot;error&quot; =&gt; %{&quot;message&quot; =&gt; msg}}), do: msg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   defp get_error_message(body), do: inspect(body)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   # Kode lainnya...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Potongan kode di atas menambahkan beberapa fungsi baru agar pengalaman pengguna menjadi lebih baik. Fungsi &lt;code&gt;print_thinking/0&lt;/code&gt; akan menampilkan indikator &amp;quot;Berpikir...&amp;quot; dengan warna cyan saat aplikasi sedang menunggu respons dari LLM. Fungsi &lt;code&gt;print_response/1&lt;/code&gt; akan menampilkan respons sukses dengan warna hijau, sedangkan fungsi &lt;code&gt;print_error/1&lt;/code&gt; akan menampilkan pesan kesalahan dengan warna merah. Selain itu, kita juga memperbarui fungsi &lt;code&gt;main/1&lt;/code&gt; untuk memanggil fungsi-fungsi baru ini sesuai dengan hasil yang diterima dari fungsi &lt;code&gt;call/1&lt;/code&gt;. Terakhir, kita memperbarui pesan bantuan di dalam fungsi &lt;code&gt;help_message/0&lt;/code&gt; agar lebih informatif dan menarik.&lt;/p&gt;
&lt;figure&gt;
	&lt;img src=&quot;https://rizafahmi.com/assets/images/agentic/demo-0001.png&quot; alt=&quot;Demo error&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
	&lt;figcaption&gt;Demo error&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
	&lt;img src=&quot;https://rizafahmi.com/assets/images/agentic/demo-0002.png&quot; alt=&quot;Demo indikator&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
	&lt;figcaption&gt;Demo indikator&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
	&lt;img src=&quot;https://rizafahmi.com/assets/images/agentic/demo-0003.png&quot; alt=&quot;Demo berhasil&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
	&lt;figcaption&gt;Demo berhasil&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Kita mulai pengembangan aplikasi dari awal dengan program sederhana yang mencetak &amp;quot;Hello, world!&amp;quot;. Sekarang, 100-an baris kode kemudian, kita punya program yang bisa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ Berkomunikasi dengan LLM Gemini lewat REST API&lt;/li&gt;
&lt;li&gt;✅ Parsing JSON response dengan pattern matching&lt;/li&gt;
&lt;li&gt;✅ Menangani 5 jenis error berbeda (API_KEY, validation, HTTP errors, timeout, malformed response)&lt;/li&gt;
&lt;li&gt;✅ Memberikan feedback visual dengan status indicator dan color coding&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Pattern matching&lt;/em&gt; Elixir membuat kode kita deklaratif dan mudah dipahami. &lt;em&gt;Error handling&lt;/em&gt; yang tadinya bisa menjadi potensial &lt;code&gt;if/else&lt;/code&gt; bercabang, dapat ditangani dengan lebih elegan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tapi ini baru fondasi awal.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Aplikasi kita saat ini &lt;em&gt;stateless&lt;/em&gt;. Setiap pertanyaan adalah &lt;em&gt;fresh start&lt;/em&gt;. LLM tidak &amp;quot;mengingat&amp;quot; apa yang baru saja kita tanyakan. Akan kita lanjut di artikel berikutnya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Eksperimen mandiri&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Clone repository lengkap di &lt;a href=&quot;https://github.com/rizafahmi/mbb&quot;&gt;https://github.com/rizafahmi/mbb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Eksperimen dengan konfigurasi: naikkan &lt;code&gt;temperature&lt;/code&gt; ke 0.7 untuk respons kreatif, atau ubah &lt;code&gt;thinkingLevel&lt;/code&gt; ke &amp;quot;HIGH&amp;quot; untuk reasoning yang lebih dalam&lt;/li&gt;
&lt;li&gt;Coba tanyakan pertanyaan pemrograman kompleks dan lihat bagaimana model merespons&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tulis di kolom komentar jika menemukan bug atau punya ide fitur baru.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Fondasi Agentic Coding - Apa itu Agent?</title>
    <link href="https://rizafahmi.com/catatan/agentic-coding/"/>
    <updated>2026-02-06T00:00:00Z</updated>
    <pubDate>2026-02-06T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/catatan/agentic-coding/</id>
    <summary>Seri Agentic Coding ➡︎ Fondasi Agentic Coding - Apa itu Agent? Fondasi Agentic Coding - Integrasi LLM Bayangkan teman-teman cukup menulis dan memberi perintah 'Buatkan aplikasi untuk mencatat pengeluaran', lalu…</summary>
    <category term="catatan"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/agentic-coding.png"/>
    <content type="html">&lt;p&gt;&lt;strong&gt;Seri Agentic Coding&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;➡︎ Fondasi Agentic Coding - Apa itu Agent?&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/agentic-coding-bag-2&quot;&gt;Fondasi Agentic Coding - Integrasi LLM&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;Bayangkan teman-teman cukup menulis dan memberi perintah &#39;Buatkan aplikasi untuk mencatat pengeluaran&#39;, lalu tiba-tiba file baru muncul, terminal berjalan sendiri, dan beberapa menit berselang aplikasi sudah siap untuk digunakan. Apakah ini sihir? Bukan, ini &lt;em&gt;Agentic Coding&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Agentic coding tool&lt;/em&gt; seperti &lt;a href=&quot;https://claude.com/product/claude-code&quot;&gt;Claude Code&lt;/a&gt;, &lt;a href=&quot;https://openai.com/codex/&quot;&gt;Codex&lt;/a&gt;, &lt;a href=&quot;https://cursor.com/&quot;&gt;Cursor&lt;/a&gt; atau yang lainnya, memang rasanya seperti sihir. Sedikit sulit dipercaya, apalagi yang belum merasakan manfaatnya. Bagi yang belum menggunakan, silakan dicoba dalam jangka beberapa waktu. Cepat atau lambat teman-teman akan merasakan daya magisnya.&lt;/p&gt;
&lt;p&gt;Tapi di balik layar, semua itu bukanlah sihir. Melainkan sebuah pola yang disebut &lt;em&gt;agentic coding&lt;/em&gt;.
Di artikel ini, kita tidak hanya akan mengintip ke balik tirai, kita akan belajar bagaimana cara kerjanya dan mempelajari polanya.&lt;/p&gt;
&lt;p&gt;Paham cara kerjanya tentu akan membantu kita menggunakan agentic coding dengan lebih efektif dan efisien. Semoga setelah membaca tulisan ini teman-teman bisa mendapat gambaran yang lebih jelas tentang apa itu agent dan apa yang membedakan AI agent dengan AI yang bukan agent.&lt;/p&gt;
&lt;p&gt;Sebelum itu, mari kita lihat bagaimana perjalanan asisten ngoding dari awal hingga sekarang.&lt;/p&gt;
&lt;h2&gt;Dari Tukang Ketik ke Mandor Proyek&lt;/h2&gt;
&lt;p&gt;Perkakas ngoding dengan AI ini telah melewati evolusi yang cukup cepat. Mulai dari &lt;em&gt;chatbot&lt;/em&gt; , &lt;em&gt;autocomplete&lt;/em&gt; , &lt;em&gt;coding assistant&lt;/em&gt;, hingga sekarang kita memasuki eranya &lt;em&gt;agentic coding&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Chatbot&lt;/em&gt; umumnya menggunakan antarmuka web. Ketika butuh bantuan, kita membuka &lt;a href=&quot;https://chatgpt.com/&quot;&gt;chatgpt.com&lt;/a&gt;, &lt;a href=&quot;https://claude.ai/&quot;&gt;claude.ai&lt;/a&gt;, &lt;a href=&quot;https://gemini.google/&quot;&gt;gemini.google&lt;/a&gt;, dsb. Bertanya tentang topik pemrograman (atau topik apapun), si &lt;em&gt;chatbot&lt;/em&gt; memberikan potongan kode yang dibutuhkan. Lalu kita sebagai developer menyalin kode tersebut dan melanjutkan proses pengembangan aplikasi. Dan begitu seterusnya.&lt;/p&gt;
&lt;figure&gt;
	&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/chatbot-300w.webp 300w, https://rizafahmi.com/img/chatbot-600w.webp 600w, https://rizafahmi.com/img/chatbot-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/chatbot-300w.png&quot; alt=&quot;Chatbot Web&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;912&quot; srcset=&quot;https://rizafahmi.com/img/chatbot-300w.png 300w, https://rizafahmi.com/img/chatbot-600w.png 600w, https://rizafahmi.com/img/chatbot-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;
	&lt;figcaption&gt;Chatbot web&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Berikutnya muncul fitur &lt;em&gt;autocomplete&lt;/em&gt;. Diawali oleh munculnya &lt;a href=&quot;https://github.com/features/copilot&quot;&gt;GitHub Copilot&lt;/a&gt; yang diusung oleh &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;Visual Studio Code&lt;/a&gt;. Biasanya kita mengetik sesuatu di editor kode lalu AI akan mencoba &amp;quot;menebak&amp;quot; kita maunya apa. Atau &lt;em&gt;autocomplete&lt;/em&gt; bisa dipantik dengan menulis komentar kita ingin melakukan apa, lalu AI akan memberikan tebakan terbaiknya.&lt;/p&gt;
&lt;figure&gt;
	&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/autocomplete-300w.webp 300w, https://rizafahmi.com/img/autocomplete-600w.webp 600w, https://rizafahmi.com/img/autocomplete-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/autocomplete-300w.png&quot; alt=&quot;Autocomplete&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;920&quot; srcset=&quot;https://rizafahmi.com/img/autocomplete-300w.png 300w, https://rizafahmi.com/img/autocomplete-600w.png 600w, https://rizafahmi.com/img/autocomplete-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;
	&lt;figcaption&gt;Fitur autocomplete&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Kemudian berkembang lagi. Dengan kemunculan code editor baru, &lt;a href=&quot;https://cursor.com/&quot;&gt;Cursor&lt;/a&gt;, asisten ngoding semakin populer. Sederhananya, ini adalah &lt;em&gt;chatbot&lt;/em&gt; yang tadinya diakses dengan web browser sekarang ada langsung di editor kode. Dengan tambahan konteks file yang sedang dibuka sehingga kita tidak perlu &lt;em&gt;copas&lt;/em&gt; lagi. Dan beberapa fitur menarik lainnya seperti &lt;em&gt;inline chat&lt;/em&gt;, hingga fitur yang mampu memahami proyek secara keseluruhan dengan berbagai metodenya seperti &lt;em&gt;indexing code&lt;/em&gt;, &lt;a href=&quot;https://aider.chat/2023/10/22/repomap.html&quot;&gt;repomap&lt;/a&gt; dan sebagainya.&lt;/p&gt;
&lt;p&gt;Setiap kode yang ditambahkan, tetap ada peran kita sebagai manusia yang melakukan perubahan. Menyimpan perubahan file misalnya. Meskipun biasanya editor kita set untuk melakukan &lt;em&gt;auto save&lt;/em&gt;. File baru pun harus kita yang buat.&lt;/p&gt;
&lt;figure&gt;
	&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/assistant-300w.webp 300w, https://rizafahmi.com/img/assistant-600w.webp 600w, https://rizafahmi.com/img/assistant-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/assistant-300w.png&quot; alt=&quot;Coding assistant&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;919&quot; srcset=&quot;https://rizafahmi.com/img/assistant-300w.png 300w, https://rizafahmi.com/img/assistant-600w.png 600w, https://rizafahmi.com/img/assistant-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;
	&lt;figcaption&gt;Coding assistant&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Terakhir, tibalah kita ke era agentic. Jika menggunakan agen, semuanya serba otomatis. Bikin file baru, baca, tulis dan ubah file, menjalankan perintah terminal dan sebagainya bisa dilakukan oleh LLM. Dimulai dari &lt;a href=&quot;https://cursor.com/learn/agents&quot;&gt;Cursor&lt;/a&gt; dan dipopulerkan oleh &lt;a href=&quot;https://claude.com/product/claude-code&quot;&gt;Claude Code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Salah satu ciri khas &lt;em&gt;agentic coding&lt;/em&gt; ketika diberi perintah, LLM akan merencanakan, membuat langkah demi langkah untuk menyelesaikan perintah terus menerus sampai perintah dianggap sudah selesai. Jadi si agen ini bukan hanya berusaha menyelesaikan perintah tapi seolah ia berpikir, berencana baru mengeksekusi hingga selesai.&lt;/p&gt;
&lt;figure&gt;
	&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/agentic-300w.webp 300w, https://rizafahmi.com/img/agentic-600w.webp 600w, https://rizafahmi.com/img/agentic-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/agentic-300w.png&quot; alt=&quot;Agentic coding&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;927&quot; srcset=&quot;https://rizafahmi.com/img/agentic-300w.png 300w, https://rizafahmi.com/img/agentic-600w.png 600w, https://rizafahmi.com/img/agentic-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;
	&lt;figcaption&gt;Agentic coding&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Cara ini cocok sekali untuk tugas yang kompleks dan sulit dikerjakan dalam sekali tembak. Kok bisa ya tiba-tiba ada LLM yang bisa &amp;quot;mikir&amp;quot;, buat rencana lalu eksekusi?&lt;/p&gt;
&lt;h2&gt;Pola &lt;em&gt;Agentic&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Agent&lt;/em&gt; atau &lt;em&gt;Agentic&lt;/em&gt; berasal dari kata &lt;em&gt;agency&lt;/em&gt;. &lt;em&gt;Agency&lt;/em&gt; secara harfiah berarti kemampuan untuk bertindak, bukan cuma berpikir atau memberi saran. Atau dengan kata lain punya inisiatif.&lt;/p&gt;
&lt;p&gt;LLM tanpa agen layaknya &lt;strong&gt;AI dalam tempurung&lt;/strong&gt;. Jago ngomong, pengetahuan luas, walaupun terbatas (&lt;em&gt;cut off&lt;/em&gt;). Meski pintar menjawab pertanyaan kita, tapi LLM tidak bisa berbuat apa-apa, tidak bisa mengingat apapun dan tidak mampu memutuskan jika diberi pilihan. Tidak bisa membaca file, menulis file bahkan tidak tahu tanggal dan jam berapa saat ini.&lt;/p&gt;
&lt;figure&gt;
	&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/tempurung-300w.webp 300w, https://rizafahmi.com/img/tempurung-507w.webp 507w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/tempurung-300w.png&quot; alt=&quot;Ilustrasi LLM&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;507&quot; height=&quot;688&quot; srcset=&quot;https://rizafahmi.com/img/tempurung-300w.png 300w, https://rizafahmi.com/img/tempurung-507w.png 507w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;
	&lt;figcaption&gt;Ilustrasi LLM: AI dalam tempurung&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;LLM adalah mesin prediksi token. Berusaha menyelesaikan teks dengan probabilitas tertinggi. Termasuk juga &lt;em&gt;autocomplete&lt;/em&gt; kode, yang adalah teks. Kemampuan dasar LLM adalah menghasilkan teks, tidak dapat mengetahui apa yang terjadi disekitarnya. Tidak tahu tanggal dan jam saat ini, baca dan tulis file, bahkan percakapan terdahulu pun LLM tidak ingat. Kecuali diberi akses untuk mendapatkan informasi tanggal dan jam saat ini, akses untuk baca dan tulis file atau menyertakan percakapan terdahulu.&lt;/p&gt;
&lt;p&gt;Jadi sebenarnya LLM itu bukan kurang pintar, cuma kurang diberi akses saja.&lt;/p&gt;
&lt;figure&gt;
	&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/tool-300w.webp 300w, https://rizafahmi.com/img/tool-600w.webp 600w, https://rizafahmi.com/img/tool-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/tool-300w.png&quot; alt=&quot;LLM + Tools&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;723&quot; srcset=&quot;https://rizafahmi.com/img/tool-300w.png 300w, https://rizafahmi.com/img/tool-600w.png 600w, https://rizafahmi.com/img/tool-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;
	&lt;figcaption&gt;LLM + Tools&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Jadi gimana caranya supaya LLM punya inisiatif? Persenjatai LLM dengan perkakas atau &lt;em&gt;tools&lt;/em&gt;. Mulai dari yang sederhana seperti kasih akses untuk &lt;em&gt;ngecek&lt;/em&gt; jam dan tanggal, &lt;em&gt;ngecek&lt;/em&gt; kurs atau cuaca hingga memberikan akses untuk baca dan tulis file.&lt;/p&gt;
&lt;p&gt;LLM dengan perkakas ini, ditambah perkakas untuk menyimpan percakapan dan kemampuan untuk menentukan pilihan perkakas mana yang cocok, dan berjalan terus-menerus hingga tugas selesai itulah yang disebut sebagai AI Agent.&lt;/p&gt;
&lt;figure&gt;
	&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/ai-300w.webp 300w, https://rizafahmi.com/img/ai-600w.webp 600w, https://rizafahmi.com/img/ai-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/ai-300w.png&quot; alt=&quot;Agentic looping&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;836&quot; srcset=&quot;https://rizafahmi.com/img/ai-300w.png 300w, https://rizafahmi.com/img/ai-600w.png 600w, https://rizafahmi.com/img/ai-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;
	&lt;figcaption&gt;Agentic looping&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Dengan kata lain, LLM disebut sebagai agen atau &lt;em&gt;agentic&lt;/em&gt; jika LLM berjalan terus-menerus (&lt;em&gt;loop&lt;/em&gt;) yang dapat melakukan observasi apa yang sedang dikerjakan, disediakan perkakas untuk bekerja dan punya kemampuan untuk memutuskan kapan sebuah pekerjaan dinyatakan selesai.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/loop-300w.webp 300w, https://rizafahmi.com/img/loop-600w.webp 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/loop-300w.png&quot; alt=&quot;Agentic Looping&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;600&quot; height=&quot;337&quot; srcset=&quot;https://rizafahmi.com/img/loop-300w.png 300w, https://rizafahmi.com/img/loop-600w.png 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2&gt;Tiga Komponen Utama&lt;/h2&gt;
&lt;p&gt;Ada tiga komponen utama dalam &lt;strong&gt;Agentic AI&lt;/strong&gt;, yaitu: perkakas, memori dan reasoning loop. Mari kita bahas satu-per-satu.&lt;/p&gt;
&lt;h3&gt;Perkakas&lt;/h3&gt;
&lt;p&gt;Memberikan kemampuan kepada LLM. Misalnya kemampuan mendapatkan informasi tanggal dan jam saat ini, cuaca di sebuah kota, harga emas terkini, hingga mengoperasikan file seperti baca dan tulis bahkan kita bisa memberikan kemampuan untuk menjalankan perintah bash.&lt;/p&gt;
&lt;h3&gt;Memori&lt;/h3&gt;
&lt;p&gt;Memberikan daya ingat, jangka panjang ataupun jangka pendek akan membuat LLM semakin terlihat &amp;quot;pintar&amp;quot;. LLM bisa paham siapa yang sedang berbicara, tugas apa yang ingin diselesaikan karena setiap percakapan baru ditambahkan ke dalam memori. Mulai dari yang paling sederhana, menambahkan ke struktur data array dan mengirimkan kembali histori percakapan hingga yang canggih seperti database eksternal.&lt;/p&gt;
&lt;p&gt;Kita bisa saja setiap kali ingin mengirimkan perintah selalu menyertakan percakapan terdahulu. Namun dalam jangka panjang hal ini menjadi melelahkan dan membuat LLM menjadi terlihat &amp;quot;bodoh&amp;quot;. Atau bahkan membuat LLM bingung karena kebanyakan konteks.&lt;/p&gt;
&lt;p&gt;Hal ini terjadi karena LLM memiliki batasan pandangan yang disebut &lt;strong&gt;Context Window&lt;/strong&gt;. Bayangkan &lt;em&gt;context window&lt;/em&gt; seperti meja kerja. Memori adalah lemari arsip yang penuh dengan dokumen. Kita tidak bisa menumpuk semua isi lemari ke atas meja sekaligus karena mejanya akan penuh, berantakan, dan kita malah tidak bisa bekerja.&lt;/p&gt;
&lt;figure&gt;
	&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/meja-300w.webp 300w, https://rizafahmi.com/img/meja-600w.webp 600w, https://rizafahmi.com/img/meja-1024w.webp 1024w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/meja-300w.png&quot; alt=&quot;Ilustrasi meja yang penuh dokumen&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1024&quot; height=&quot;547&quot; srcset=&quot;https://rizafahmi.com/img/meja-300w.png 300w, https://rizafahmi.com/img/meja-600w.png 600w, https://rizafahmi.com/img/meja-1024w.png 1024w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;
	&lt;figcaption&gt;Ilustrasi meja yang penuh dokumen. Dibuat oleh AI.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Di sinilah &lt;strong&gt;Context Engineering&lt;/strong&gt; berperan. Jika memori adalah tentang apa yang disimpan, maka &lt;em&gt;context engineering&lt;/em&gt; adalah tentang bagaimana kita memilih dan menyusun informasi tersebut agar LLM tetap fokus. Tanpa pengelolaan konteks yang baik, LLM akan kehilangan arah, bingung lalu mulai mengabaikan instruksi yang berada di tengah-tengah percakapan yang terlalu panjang.&lt;/p&gt;
&lt;h3&gt;&lt;em&gt;Reasoning Loop&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Dan yang tidak kalah penting adalah kemampuan LLM dalam menentukan dan memilih perkakas yang mana yang cocok digunakan ketika ada permintaan dari pengguna. Misalnya, ketika pengguna bertanya tentang jam berapa, LLM dapat memutuskan untuk menggunakan perkakas jam dan tanggal, bukan malah baca atau tulis file.&lt;/p&gt;
&lt;p&gt;Dan LLM juga punya kemampuan untuk terus menerus berusaha untuk menyelesaikan pekerjaannya. Hal inilah yang menjadi pembeda. Sebelum model Sonnet versi 3.7, LLM sulit sekali diajak &lt;em&gt;looping&lt;/em&gt;. Meskipun sudah diinstruksikan secara eksplisit kadang LLM memutuskan berhenti sebelum tuntas.&lt;/p&gt;
&lt;p&gt;Proses berpikir ini sering disebut sebagai &lt;strong&gt;Chain of Thought&lt;/strong&gt;. LLM diinstruksikan untuk berpikir dan &lt;em&gt;ngomong&lt;/em&gt; sendiri untuk merencanakan langkah-langkah untuk menyelesaikan sebuah tugas. Ketika digabung dengan perkakas lainnya, bisa menjelma menjadi sebuah framework seperti ReAct (Reason + Act) yang lebih &lt;em&gt;powerful&lt;/em&gt;. Reasoning loop ini adalah &amp;quot;&lt;strong&gt;nyawa&lt;/strong&gt;&amp;quot; dari agentic coding.&lt;/p&gt;
&lt;figure&gt;
	&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/thinking-300w.webp 300w, https://rizafahmi.com/img/thinking-600w.webp 600w, https://rizafahmi.com/img/thinking-1108w.webp 1108w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/thinking-300w.png&quot; alt=&quot;Proses berpikir ala LLM&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1108&quot; height=&quot;616&quot; srcset=&quot;https://rizafahmi.com/img/thinking-300w.png 300w, https://rizafahmi.com/img/thinking-600w.png 600w, https://rizafahmi.com/img/thinking-1108w.png 1108w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;
	&lt;figcaption&gt;Proses berpikir ala LLM&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2&gt;Praktek Membuat Agentic Coding Tool&lt;/h2&gt;
&lt;p&gt;Mari kita praktekkan langkah demi langkah. Berhubung LLM chatbot saat ini sudah dilengkapi oleh banyak perkakas, kita bisa bertanya tanggal dan jam saat ini dan LLM mampu menjawab dengan akurat. Karena itu kita akan membuat LLM chatbot dari awal dengan menggunakan REST API.&lt;/p&gt;
&lt;figure&gt;
	&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/gemini-300w.webp 300w, https://rizafahmi.com/img/gemini-600w.webp 600w, https://rizafahmi.com/img/gemini-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/gemini-300w.png&quot; alt=&quot;Gemini&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;464&quot; srcset=&quot;https://rizafahmi.com/img/gemini-300w.png 300w, https://rizafahmi.com/img/gemini-600w.png 600w, https://rizafahmi.com/img/gemini-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;
	&lt;figcaption&gt;Bertanya tentang jam dan tanggal.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Untuk itu, kita akan mengirimkan data langsung ke penyedia jasa LLM melalui REST API seperti Google, Anthropic, OpenAI dan sebagainya. Untuk contoh disini akan menggunakan Google dan Gemini 3 Flash sebagai pilihan modelnya. Silakan ganti URL, model dan variable API_KEY jika ingin menggunakan penyedia jasa LLM lain.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; API_KEY&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;-AI&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; -X&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; POST&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:generateContent?key=${&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;API_KEY&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;}&quot;&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    -H&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    -d&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &#39;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;        &quot;contents&quot;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;          {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;            &quot;role&quot;: &quot;user&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;            &quot;parts&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;              &quot;text&quot;: &quot;Tanggal dan jam berapa sekarang?&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;          }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;        ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;        &quot;generationConfig&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;            &quot;thinkingConfig&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;                &quot;thinkingLevel&quot;: &quot;LOW&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;    }&#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;candidates&quot;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &quot;content&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        &quot;parts&quot;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            &quot;text&quot;: &quot;Sekarang adalah hari **Jumat, 24 Mei 2024**.&#92;n&#92;nWaktu saat ini menunjukkan pukul **14:34 WIB** (Waktu Indonesia Barat).&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;p&gt;Halu kan?! Saat menulis ini saya berada di tahun 2026. Ini bukanlah trik mesin waktu. Lebih kepada LLM belum diberi akses untuk mendapatkan informasi tanggal dan jam sehingga LLM terpaksa berbohong. Karena memang di desain seperti itu, untuk memastikan tugasnya selesai walaupun keliru.&lt;/p&gt;
&lt;h2&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Agentic coding itu bukan sulap bukan sihir. Agentic merupakan pola kerja. LLM pada dasarnya hanyalah mesin prediksi token: jago menebak kelanjutan teks, tapi “buta” terhadap dunia nyata kalau tidak diberi akses apa pun. Begitu kita lengkapi LLM dengan perkakas (bisa baca/tulis file, cek waktu, jalanin perintah), kita beri daya ingat (supaya tidak gampang lupa), dan kita bantu LLM bekerja dalam reasoning loop (merencanakan → mengeksekusi → mengamati → mengulang), barulah ia terlihat punya agency: bisa bertindak, bukan cuma menjawab.&lt;/p&gt;
&lt;p&gt;Contoh paling sederhana adalah pertanyaan “jam berapa sekarang?” Tanpa diberi akses untuk mendapatkan informasi waktu, LLM bisa saja menjawab dengan percaya diri tapi keliru. Bukan karena bodoh, melainkan karena tidak punya cara untuk memverifikasi. Di sinilah inti agentic: kualitas output bukan cuma ditentukan oleh “seberapa pintar modelnya”, tapi juga oleh akses, batasan, dan mekanisme verifikasi yang kita desain. Setelah paham pola ini, kita bisa menggunakan agentic coding tools lebih efektif.&lt;/p&gt;
&lt;p&gt;Perkakas yang diberikan bisa apa saja, namun untuk &amp;quot;menyulap&amp;quot; LLM agar menjadi lebih punya inisiatif atau agentic, LLM perlu setidaknya tiga komponen utama:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Perkakas. Layaknya manusia, bekali dengan perkakas sehingga dapat melakukan sesuatu, tidak hanya menjawab pertanyaan atau berbicara saja.&lt;/li&gt;
&lt;li&gt;Memori. Memberikan daya ingat agar LLM tetap relevan dan sesuai konteks.&lt;/li&gt;
&lt;li&gt;Reasoning loop. Mekanisme yang membantu LLM akan terus mencoba hingga tugasnya dianggap selesai.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/agentic-coding-bag-2&quot;&gt;Di bagian berikutnya&lt;/a&gt; kita akan bikin versi minimal agentic coding tool melanjutkan aplikasi chatbot sederhana yang tadi sudah kita bahas.&lt;/p&gt;
&lt;h2&gt;Referensi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;📺 &lt;a href=&quot;https://www.youtube.com/watch?v=oP6DS_x5K0Y&quot;&gt;What Are AI Agents &amp;amp; How Do They Work by ByteByteAI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🐦 &lt;a href=&quot;https://x.com/tyohan/status/1992940420322799693&quot;&gt;How to work with coding agent by @tyohan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📺 &lt;a href=&quot;https://ngobrol.in/episodes/ZcYNuHirHOA-agentic-ai-ngobrolin-web/&quot;&gt;Ngobrolin Web Episode Agentic AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🎶 &lt;a href=&quot;https://syntax.fm/show/976/pi-the-ai-harness-that-powers-openclaw-w-armin-ronacher-and-mario-zechner/transcript&quot;&gt;Syntax.fm Episode Pi - The AI Harness That Powers OpenClaw W/ Armin Ronacher &amp;amp; Mario Zechner&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Desain Antarmuka dengan Asisten Ngoding</title>
    <link href="https://rizafahmi.com/catatan/asisten-ngoding-4/"/>
    <updated>2025-08-19T00:00:00Z</updated>
    <pubDate>2025-08-19T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/catatan/asisten-ngoding-4/</id>
    <summary>Seri Asisten Ngoding Produktif dengan Asisten Ngoding Diskusi dan Menulis Spesifikasi dengan AI Menyusun Rencana dengan Asisten Ngoding ➡︎ Desain Antarmuka dengan Asisten Ngoding Menulis Kode dengan Asisten Ngoding…</summary>
    <category term="catatan, ai, agentic-coding, desain-ui"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/asisten-ngoding-4.png"/>
    <content type="html">&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Seri Asisten Ngoding&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding&quot;&gt;Produktif dengan Asisten Ngoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-2&quot;&gt;Diskusi dan Menulis Spesifikasi dengan AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-3&quot;&gt;Menyusun Rencana dengan Asisten Ngoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;➡︎ Desain Antarmuka dengan Asisten Ngoding&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-5&quot;&gt;Menulis Kode dengan Asisten Ngoding&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;Setelah &lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-4/asisten-ngoding-3.md&quot;&gt;bagian sebelumnya&lt;/a&gt; kita berhasil menghasilkan rencana yang matang dalam format &lt;em&gt;blueprint&lt;/em&gt;, kini saatnya untuk melangkah ke tahap yang paling dinanti: eksekusi! Ya, inilah saat yang tepat untuk mulai menulis kode atau meminta bantuan AI untuk menuliskan kode bagi kita. Dalam artikel ini, saya akan membagikan pengalaman pribadi dan tips praktis yang bisa langsung teman-teman terapkan. Tentu saja, pilihan ada di tangan teman-teman dengan segala konsekuensi yang menyertainya 😉&lt;/p&gt;
&lt;p&gt;Berpikir tentang desain antarmuka yang menarik dan fungsional seringkali menjadi tantangan tersendiri. Mari kita mulai dengan pendekatan yang terbukti efektif!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    +----------+        +---------+        +----------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |          |        |         |        |    ✅    |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    | Diskusi  | -----&gt; |  Susun  | -----&gt; | Eksekusi |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |   Ide    |        | Rencana |        |          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |          |        |         |        |          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    +----------+        +---------+        +----------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                                 |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                                 |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                                 V&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                           +----------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                           |          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                           |  Kelola  |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                           |          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                           +----------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Mengapa HTML lebih baik daripada &lt;em&gt;mockup&lt;/em&gt; statis&lt;/h2&gt;
&lt;p&gt;Sebelum menyelami berbagai logika dalam bentuk kode, langkah yang bijak adalah membuat &lt;em&gt;mockup&lt;/em&gt; desain dan alur aplikasi terlebih dahulu. Namun, daripada membuat &lt;em&gt;mockup&lt;/em&gt; desain dalam bentuk gambar statis yang tidak memiliki interaksi, lebih efektif jika kita langsung membuat desain dalam bentuk HTML, CSS, dan JavaScript (jika diperlukan).
+
+&lt;strong&gt;Mengapa pendekatan ini lebih unggul?&lt;/strong&gt; Pertama, kita bisa langsung menguji interaksi dan responsivitas desain. Kedua, kita menghemat waktu yang biasanya terbuang untuk membuat ulang desain statis menjadi kode. Ketiga, hasilnya bisa langsung digunakan sebagai fondasi pengembangan. Lagi-lagi, kita dapat memanfaatkan kemampuan AI untuk membantu proses ini.&lt;/p&gt;
&lt;h2&gt;Memilih Tools yang Tepat untuk Membangun Antarmuka&lt;/h2&gt;
&lt;p&gt;Berbagai alat bantu tersedia untuk membantu kita membangun antarmuka aplikasi yang menarik dan fungsional. Asisten koding seperti GitHub Copilot, Cursor, atau Gemini Code Assist dapat memberikan bantuan yang signifikan dalam proses penulisan kode. Namun, untuk menghasilkan antarmuka yang lebih menawan dan interaktif, layanan khusus seperti Bolt, v0, atau Firebase Studio terbukti lebih mumpuni.&lt;/p&gt;
&lt;h3&gt;Perbandingan Tools AI untuk Desain Antarmuka&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Alat&lt;/th&gt;
&lt;th&gt;Keunggulan&lt;/th&gt;
&lt;th&gt;Cocok untuk&lt;/th&gt;
&lt;th&gt;Tingkat Kesulitan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Copilot&lt;/td&gt;
&lt;td&gt;Integrasi dengan editor&lt;/td&gt;
&lt;td&gt;Pengembangan kode harian&lt;/td&gt;
&lt;td&gt;Menengah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;AI-powered editing&lt;/td&gt;
&lt;td&gt;Prototyping cepat&lt;/td&gt;
&lt;td&gt;Mudah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bolt&lt;/td&gt;
&lt;td&gt;Full-stack generation&lt;/td&gt;
&lt;td&gt;Aplikasi lengkap&lt;/td&gt;
&lt;td&gt;Menengah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v0&lt;/td&gt;
&lt;td&gt;Component-focused&lt;/td&gt;
&lt;td&gt;Desain komponen UI&lt;/td&gt;
&lt;td&gt;Mudah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firebase Studio&lt;/td&gt;
&lt;td&gt;Integrasi denga Firebase&lt;/td&gt;
&lt;td&gt;Aplikasi dengan backend&lt;/td&gt;
&lt;td&gt;Menengah&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Dari tabel di atas, terlihat bahwa masing-masing tools memiliki spesialisasi tersendiri. Pilihan yang tepat tergantung pada kebutuhan proyek dan tingkat kenyamanan teman-teman dengan teknologi tertentu.&lt;/p&gt;
&lt;p&gt;Keunggulan lain dalam menggunakan &lt;em&gt;AI Interface Builder&lt;/em&gt; terletak pada kemampuannya menyiapkan &lt;em&gt;project boilerplate&lt;/em&gt; yang sudah terstruktur dengan baik. Hal ini sangat membantu, terutama jika teman-teman memilih platform Node.js sebagai basis pengembangan.&lt;/p&gt;
&lt;h3&gt;Tantangan Integrasi dalam Proyek AI&lt;/h3&gt;
&lt;p&gt;Pengalaman pribadi sejauh ini, jika teknologi yang digunakan butuh integrasi manual, AI akan kesulitan. Contohnya seperti proyek berbasis Node.js dengan backend Express/Hono/Astro yang pada dasarnya belum dilengkapi dengan alat tambahan seperti database, otentikasi dan lain sebagainya.&lt;/p&gt;
&lt;p&gt;+&lt;strong&gt;Masalah Utama:&lt;/strong&gt; AI seringkali mengalami kesulitan ketika harus melakukan integrasi dengan konfigurasi tambahan&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solusi yang Efektif:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Siapkan integrasi database dan otentikasi terlebih dahulu sebelum memulai development&lt;/li&gt;
&lt;li&gt;Gunakan &lt;em&gt;project boilerplate&lt;/em&gt; yang sudah terintegrasi&lt;/li&gt;
&lt;li&gt;Pilih &lt;em&gt;framework&lt;/em&gt; dengan fitur lengkap (&lt;em&gt;batteries included&lt;/em&gt;) seperti Elixir Phoenix, Ruby on Rails, atau PHP Laravel&lt;/li&gt;
&lt;li&gt;Pertimbangkan AdonisJS sebagai alternatif untuk nodejs.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pengalaman yang sangat menyenangkan saya dapatkan ketika menggunakan asisten koding bersama &lt;a href=&quot;https://phoenixframework.org/&quot;&gt;Elixir Phoenix&lt;/a&gt;. Jika teman-teman tertarik dengan cerita lengkapnya, silakan &lt;a href=&quot;https://youtube.com/live/dk8JSYuOmhc?feature=share&quot;&gt;menyaksikan video berikut&lt;/a&gt; yang membahas pengalaman tersebut secara detail.&lt;/p&gt;
&lt;p&gt;Jika teman-teman memiliki pengalaman berbeda atau trik yang menarik, jangan ragu untuk membagikannya di kolom komentar. Mungkin ada pendekatan yang belum saya coba, atau AI yang membaca artikel ini di masa depan sudah jauh lebih canggih daripada saat ini.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Update: &lt;a href=&quot;https://firebase.blog/posts/2025/05/whats-new-at-google-io&quot;&gt;Firebase Studio&lt;/a&gt; sepertinya sudah mengantisipasi hal ini dengan mengintegrasikan otentikasi dan database kedalam servisnya.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Desain antarmuka&lt;/h2&gt;
&lt;h3&gt;Langkah Praktis: Membangun Antarmuka dengan Firebase Studio&lt;/h3&gt;
&lt;p&gt;Untuk desain antarmuka, terdapat beberapa pilihan yang dapat disesuaikan dengan kebutuhan proyek. Jika v0 lebih cocok digunakan untuk mendesain komponen individual, &lt;a href=&quot;https://bolt.new/?rid=nzeu0d&quot;&gt;Bolt.new&lt;/a&gt; atau &lt;a href=&quot;https://studio.firebase.google.com/&quot;&gt;Firebase Studio&lt;/a&gt; dapat dimanfaatkan untuk membangun UI lengkap untuk aplikasi frontend. Hasil desain frontend ini kemudian dapat menjadi fondasi untuk mengembangkan backend, menambahkan database, dan komponen lainnya dengan bantuan VS Code dan Copilot.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro Tip:&lt;/strong&gt; Gunakan spesifikasi yang sudah dibuat di &lt;code&gt;spec.md&lt;/code&gt; sebagai fondasi prompt kita. Semakin detail spesifikasi, semakin baik hasil yang akan dihasilkan AI!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Berikut adalah contoh &lt;em&gt;prompt&lt;/em&gt; yang saya gunakan:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Objective:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Develop a platform to store text-based ideas with search functionality and a minimalist neo-brutalist design.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Core Features:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Text Note Storage: Users can store plain text notes.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Search Functionality: Full-text search to locate notes.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Note Management: Users can edit and delete existing notes. Idea Creation: If no search results match, users can save the entered text as a new idea.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Design:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Style: Minimalist, neo-brutalist design approach with a focus on functionality.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Theme: Light theme only.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Layout: Main page includes a search form with results shown below.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/firebase-300w.webp 300w, https://rizafahmi.com/img/firebase-600w.webp 600w, https://rizafahmi.com/img/firebase-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/firebase-300w.png&quot; alt=&quot;contoh firebase studio&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;643&quot; srcset=&quot;https://rizafahmi.com/img/firebase-300w.png 300w, https://rizafahmi.com/img/firebase-600w.png 600w, https://rizafahmi.com/img/firebase-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Hasil dari &lt;a href=&quot;https://studio.firebase.google.com/studio-9374311499&quot;&gt;Firebase Studio&lt;/a&gt; dapat diunduh lalu dijalankan di localhost dan dibuka dengan AI Code Editor pilihan. Tidak lupa untuk melakukan &lt;code&gt;npm install&lt;/code&gt;, &lt;code&gt;npm run build&lt;/code&gt; dan &lt;code&gt;npm start&lt;/code&gt; atau &lt;code&gt;npm run dev&lt;/code&gt; tergantung instruksi dari proyeknya. Meskipun menulis kode langsung juga sangat memungkinkan karena Firebase Studio sudah dilengkapi editor kode yang mumpuni.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/firebase-download-300w.webp 300w, https://rizafahmi.com/img/firebase-download-600w.webp 600w, https://rizafahmi.com/img/firebase-download-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/firebase-download-300w.png&quot; alt=&quot;download and zip&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;647&quot; srcset=&quot;https://rizafahmi.com/img/firebase-download-300w.png 300w, https://rizafahmi.com/img/firebase-download-600w.png 600w, https://rizafahmi.com/img/firebase-download-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Bagaimana jika kita tidak menggunakan Node.js atau Next.js? Mengingat berbagai alat desain berbasis AI sebagian besar menggunakan Node.js atau React sebagai fondasi, solusinya adalah meminta AI untuk mengonversi hasil desain ke platform lain yang diinginkan.&lt;/p&gt;
&lt;p&gt;Topik konversi antar platform ini cukup kompleks dan menarik untuk dibahas secara terpisah di kesempatan mendatang, mengingat setiap platform memiliki karakteristik dan tantangan uniknya masing-masing.&lt;/p&gt;
&lt;h2&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Artikel ini telah membahas langkah krusial setelah perencanaan matang dalam pengembangan perangkat lunak: &lt;strong&gt;eksekusi kode&lt;/strong&gt;. Kita telah melihat bagaimana:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Membuat &lt;em&gt;mockup&lt;/em&gt; desain dalam bentuk HTML, CSS, dan JavaScript langsung lebih efisien daripada menggunakan gambar statis&lt;/li&gt;
&lt;li&gt;Memilih tools yang tepat dapat mempercepat proses development secara signifikan&lt;/li&gt;
&lt;li&gt;Memahami tantangan integrasi dan cara mengatasinya dapat menghemat waktu berjam-jam&lt;/li&gt;
&lt;li&gt;Menggunakan AI Interface Builder seperti Firebase Studio dapat menghasilkan hasil yang profesional dalam waktu singkat&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Kunci sukses&lt;/strong&gt; dalam menggunakan AI untuk desain antarmuka adalah: persiapan yang matang, pemilihan tools yang sesuai, dan pemahaman akan keterbatasan AI dalam integrasi kompleks.&lt;/p&gt;
&lt;p&gt;Pembahasan kemudian beralih ke pemilihan &lt;em&gt;tools&lt;/em&gt; yang tepat. Meskipun asisten koding seperti GitHub Copilot, Cursor, atau Gemini Code Assist sangat membantu, layanan khusus seperti Bolt, v0, atau Firebase Studio direkomendasikan untuk antarmuka yang lebih menawan. Artikel ini juga menyoroti keuntungan &lt;strong&gt;&lt;em&gt;AI Interface Builder&lt;/em&gt;&lt;/strong&gt; dalam menyiapkan &lt;em&gt;project boilerplate&lt;/em&gt; yang terstruktur, terutama untuk pengembangan berbasis Node.js.&lt;/p&gt;
&lt;p&gt;Yang terpenting, jangan takut untuk bereksperimen! Setiap proyek adalah kesempatan untuk belajar dan menemukan &lt;em&gt;workflow&lt;/em&gt; yang paling sesuai dengan gaya kerja teman-teman.&lt;/p&gt;
&lt;p&gt;Menarik ditunggu gebrakan dari Firebase Studio yang ingin mengintegrasikan beberapa alat tambahan seperti database, otentikasi dan lain sebagainya.&lt;/p&gt;
&lt;p&gt;Terakhir, artikel ini menggunakan Firebase Studio atau Bolt untuk membangun UI frontend lengkap, dengan hasil yang dapat diunduh dan dijalankan secara lokal.&lt;/p&gt;
&lt;p&gt;Dan apabila hasil desain dan kode yang dihasilkan AI terlalu kompleks, teman-teman bisa jadikan hasil desain tersebut sebagai &lt;em&gt;mockup&lt;/em&gt; saja. Lalu tiru desainnya dengan menulis kode versi kita sendiri.&lt;/p&gt;
&lt;p&gt;Saya sangat penasaran dengan pengalaman teman-teman dalam memanfaatkan AI:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tools AI mana&lt;/strong&gt; yang sudah teman-teman coba untuk desain antarmuka?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kendala terbesar&lt;/strong&gt; apa yang dihadapi saat menggunakan AI untuk development?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tips andalan&lt;/strong&gt; apa yang bisa teman-teman bagikan kepada pembaca lain?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Silakan bagikan pengalaman, pertanyaan, atau saran di kolom komentar di bawah. Siapa tahu pengalaman teman-teman bisa membantu developer lain yang sedang menghadapi tantangan serupa!&lt;/p&gt;
&lt;h2&gt;Referensi selanjutnya&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dekontaminasi.substack.com/&quot;&gt;Kumpulan artikel menarik seputar AI dan LLM dalam Bahasa Indonesia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://harper.blog/2025/02/16/my-llm-codegen-workflow-atm/&quot;&gt;https://harper.blog/2025/02/16/my-llm-codegen-workflow-atm/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://danieldelaney.net/chat&quot;&gt;https://danieldelaney.net/chat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.deeplearning.ai/courses/build-apps-with-windsurfs-ai-coding-agent&quot;&gt;https://learn.deeplearning.ai/courses/build-apps-with-windsurfs-ai-coding-agent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://firebase.blog/posts/2025/05/whats-new-at-google-io&quot;&gt;https://firebase.blog/posts/2025/05/whats-new-at-google-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Produktif dengan Asisten Ngoding</title>
    <link href="https://rizafahmi.com/catatan/asisten-ngoding/"/>
    <updated>2025-06-13T00:00:00Z</updated>
    <pubDate>2025-06-13T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/catatan/asisten-ngoding/</id>
    <summary>Seri Asisten Ngoding ➡︎ Produktif dengan Asisten Ngoding Diskusi dan Menulis Spesifikasi dengan AI Menyusun Rencana dengan Asisten Ngoding Desain Antarmuka dengan Asisten Ngoding Menulis Kode dengan Asisten Ngoding…</summary>
    <category term="catatan, ai, agentic-coding, workflow"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/asisten-ngoding.png"/>
    <content type="html">&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Seri Asisten Ngoding&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;➡︎ Produktif dengan Asisten Ngoding&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-2&quot;&gt;Diskusi dan Menulis Spesifikasi dengan AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-3&quot;&gt;Menyusun Rencana dengan Asisten Ngoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-4&quot;&gt;Desain Antarmuka dengan Asisten Ngoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-5&quot;&gt;Menulis Kode dengan Asisten Ngoding&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;Dunia pengembangan perangkat lunak telah mengalami transformasi signifikan dalam alat bantu pemrograman. Bermula dari fitur &lt;em&gt;autocomplete&lt;/em&gt; sederhana yang hanya menyelesaikan kata kunci atau nama fungsi yang sudah diketahui, kini berkembang menjadi sistem cerdas yang mampu memahami konteks kode secara menyeluruh. Pada era awal, IDE seperti Visual Studio atau Eclipse menawarkan saran secara statis berdasarkan pustaka yang telah didefinisikan, namun memiliki keterbatasan dalam memahami logika.&lt;/p&gt;
&lt;p&gt;Kemajuan teknologi AI, khususnya model bahasa besar (LLM), telah merevolusi asisten koding menjadi alat yang jauh lebih canggih. Asisten koding modern seperti GitHub Copilot, Cursor, ChatGPT, v0, Aider.chat dan lain sebagainya tidak hanya melengkapi baris kode yang sedang ditulis, tetapi juga mampu menghasilkan fungsi lengkap, algoritma kompleks, dan bahkan seluruh modul berdasarkan penjelasan dengan bahasa manusia. Berbeda dengan cara tradisional, asisten berbasis AI punya kemampuan memahami pola penulisan kode dalam skala besar, menganalisis struktur proyek secara keseluruhan, dan menyesuaikan saran dengan gaya dari basis kode yang sudah ada. AI dapat memberikan penjelasan, mengusulkan refaktorisasi, mengidentifikasi potensi kesalahan (&lt;em&gt;bug&lt;/em&gt;), dan bahkan menghasilkan kode pengujian (&lt;em&gt;testing&lt;/em&gt;) — kemampuan yang jauh melampaui pencapaian generasi sebelumnya.&lt;/p&gt;
&lt;h2&gt;Beberapa jenis asisten koding&lt;/h2&gt;
&lt;h3&gt;&lt;em&gt;AI Chatbot&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Meski bukan spesifik untuk membantu pemrograman, beberapa AI chatbot dapat digunakan untuk bertanya seputar kode dan pemrograman. Beberapa diantaranya:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://chatgpt.com/&quot;&gt;ChatGpt.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://claude.ai/&quot;&gt;Claude.ai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gemini.google.com/&quot;&gt;Gemini&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chat.deepseek.com/&quot;&gt;DeepSeek&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chat.qwen.ai/&quot;&gt;Qwen Chat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Selain untuk meminta saran untuk kode, AI berbasis chatbot seperti ini sangat cocok untuk diskusi atau &lt;em&gt;brainstorming&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/claude-300w.webp 300w, https://rizafahmi.com/img/claude-600w.webp 600w, https://rizafahmi.com/img/claude-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/claude-300w.png&quot; alt=&quot;contoh chatbot&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;908&quot; srcset=&quot;https://rizafahmi.com/img/claude-300w.png 300w, https://rizafahmi.com/img/claude-600w.png 600w, https://rizafahmi.com/img/claude-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3&gt;&lt;em&gt;AI Code Completion&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Dibawah ini beberapa alat yang dapat membantu untuk melengkapi kode disaat kita sedang menulis kode di editor.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/features/copilot&quot;&gt;GitHub Copilot&lt;/a&gt;: Asisten koding untuk menghasilkan, melengkapi, dan menyarankan kode secara &lt;em&gt;real-time&lt;/em&gt; berdasarkan konteks yang kita berikan. Dapat dijalankan sebagai ekstensi vscode, jetbrains, dan vim.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tabnine.com/&quot;&gt;Tabnine&lt;/a&gt;: Secara &lt;em&gt;timeline&lt;/em&gt; mungkin yang paling duluan, namun saat ini kalah pamor dibandingkan pesaingnya.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://supermaven.com/&quot;&gt;Supermaven&lt;/a&gt;: Dikenal sangat cepat dalam menghasilkan kode yang dapat digunakan di berbagai kode editor seperti vscode, vim, zed, dll.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codeium.com/&quot;&gt;Codeium&lt;/a&gt;: Ekstensi vscode &lt;em&gt;open-source&lt;/em&gt; yang dapat digunakan secara gratis untuk penggunaan personal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/completion-300w.webp 300w, https://rizafahmi.com/img/completion-600w.webp 600w, https://rizafahmi.com/img/completion-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/completion-300w.png&quot; alt=&quot;contoh code completion&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;858&quot; srcset=&quot;https://rizafahmi.com/img/completion-300w.png 300w, https://rizafahmi.com/img/completion-600w.png 600w, https://rizafahmi.com/img/completion-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3&gt;&lt;em&gt;AI Code Editor&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Evolusi berikutnya dari &lt;em&gt;code completion&lt;/em&gt;. Jika &lt;em&gt;code completion&lt;/em&gt; mampu mengerti kode yang sedang dibuka saat itu, maka &lt;em&gt;AI Code Editor&lt;/em&gt; mampu memahami proyek secara keseluruhan.&lt;br /&gt;
AI yang &amp;quot;menyatu&amp;quot; dengan kode editor. Selain mampu memberi saran terhadap kode yang sedang kita tulis (sama halnya dengan &lt;em&gt;code completion&lt;/em&gt;) &lt;em&gt;AI Code Editor&lt;/em&gt; mampu membuat, mengubah atau menghapus satu atau beberapa file sekaligus dalam satu kali perintah.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cursor.com/&quot;&gt;Cursor&lt;/a&gt;: Pelopor AI Code Editor, populer dan punya UX terbaik saat ini. Fork dari vscode.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/docs/copilot/overview&quot;&gt;VSCode + Copilot&lt;/a&gt;: Meskipun dalam bentuk extensi, Copilot (chat, edit dan agent) punya kemampuan yang cukup mumpuni.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=Google.geminicodeassist&quot;&gt;VSCode + Gemini&lt;/a&gt;: Ekstensi freemium dari Google Gemini yang sangat murah hati.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zed.dev/&quot;&gt;Zed&lt;/a&gt;: Kode editor baru yang dikenal sangat cepat.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aider.chat/&quot;&gt;Aider&lt;/a&gt;, &lt;a href=&quot;https://docs.anthropic.com/en/docs/agents-and-tools/claude-code/overview&quot;&gt;Claude Code&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://aws.amazon.com/blogs/devops/introducing-the-enhanced-command-line-interface-in-amazon-q-developer/&quot;&gt;Amazon Q Developer CLI&lt;/a&gt;: Menggunakan antarmuka teks (&lt;em&gt;cli&lt;/em&gt;), dapat digunakan dengan editor kode apapun.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/claude-code-300w.webp 300w, https://rizafahmi.com/img/claude-code-600w.webp 600w, https://rizafahmi.com/img/claude-code-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/claude-code-300w.png&quot; alt=&quot;Contoh coding assistant Claude Code&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;836&quot; srcset=&quot;https://rizafahmi.com/img/claude-code-300w.png 300w, https://rizafahmi.com/img/claude-code-600w.png 600w, https://rizafahmi.com/img/claude-code-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3&gt;&lt;em&gt;AI interface builder&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;AI yang spesifik digunakan untuk membangun &lt;em&gt;user interface&lt;/em&gt; atau desain. Jika chatbot dapat digunakan untuk apa saja termasuk membangun UI, &lt;em&gt;AI code completion&lt;/em&gt; dan &lt;em&gt;AI code editor&lt;/em&gt; pun bisa, namun hasilnya bisa berbeda. Mungkin karena AI ini menggunakan model yang memang dilatih untuk mengembangkan UI. Ada beberapa alat yang bisa digunakan.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://v0.dev/&quot;&gt;v0.dev&lt;/a&gt;: Generative AI dengan &lt;em&gt;interface chat&lt;/em&gt; yang dioptimasi untuk mengembangkan komponen React dan ekosistem Next.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bolt.new/?rid=nzeu0d&quot;&gt;bolt.new&lt;/a&gt;: Generative AI dengan &lt;em&gt;interface chat&lt;/em&gt; untuk mengembangkan aplikasi frontend.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lovable.dev/&quot;&gt;lovable.dev&lt;/a&gt;: Aplikasi yang mampu membuat aplikasi fullstack. Cocok untuk konversi desain figma menjadi kode.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/v0-300w.webp 300w, https://rizafahmi.com/img/v0-600w.webp 600w, https://rizafahmi.com/img/v0-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/v0-300w.png&quot; alt=&quot;contoh tangkapan layar dari v0&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;715&quot; srcset=&quot;https://rizafahmi.com/img/v0-300w.png 300w, https://rizafahmi.com/img/v0-600w.png 600w, https://rizafahmi.com/img/v0-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Teknologi kecerdasan buatan (AI) telah mengubah pengembangan perangkat lunak secara fundamental, berkembang dari fitur &lt;em&gt;autocomplete&lt;/em&gt; sederhana menjadi sistem cerdas yang memahami konteks kode secara menyeluruh. Kita mengidentifikasi empat kategori utama asisten koding berbasis AI: AI Chatbot untuk diskusi dan brainstorming, AI Code Completion untuk melengkapi kode secara real-time, AI Code Editor yang mampu memahami proyek secara keseluruhan, dan AI Interface Builder yang dioptimalkan khusus untuk pengembangan UI.&lt;/p&gt;
&lt;p&gt;Sekian dulu artikel tentang asisten ngoding kali ini. Nantikan artikel berikutnya ya. Umpan balik sangat berharga buat saya sebagai pertanda apakah topik ini menarik atau tidak. Boleh ya tulis pendapat atau saran di kolom komentar dibawah.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Diskusi dan Menulis Spesifikasi dengan AI</title>
    <link href="https://rizafahmi.com/catatan/asisten-ngoding-2/"/>
    <updated>2025-06-13T00:00:00Z</updated>
    <pubDate>2025-06-13T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/catatan/asisten-ngoding-2/</id>
    <summary>Seri Asisten Ngoding Produktif dengan Asisten Ngoding ➡︎ Diskusi dan Menulis Spesifikasi dengan AI Menyusun Rencana dengan Asisten Ngoding Desain Antarmuka dengan Asisten Ngoding Menulis Kode dengan Asisten Ngoding…</summary>
    <category term="catatan, ai, agentic-coding, spesifikasi"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/asisten-ngoding-2.png"/>
    <content type="html">&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Seri Asisten Ngoding&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding&quot;&gt;Produktif dengan Asisten Ngoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;➡︎ Diskusi dan Menulis Spesifikasi dengan AI&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-3&quot;&gt;Menyusun Rencana dengan Asisten Ngoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-4&quot;&gt;Desain Antarmuka dengan Asisten Ngoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-5&quot;&gt;Menulis Kode dengan Asisten Ngoding&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;Setelah di &lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-2/asisten-ngoding.md&quot;&gt;bagian sebelumnya&lt;/a&gt; kita sudah melihat berbagai jenis AI yang dapat digunakan untuk membangun aplikasi—seperti AI Chatbot, AI Code Completion, AI Code Editor, dan AI Interface Builder—tulisan berikut akan mengajak teman-teman semua melakukan eksplorasi dan melihat sejauh mana AI dapat &amp;quot;diajak&amp;quot; untuk membangun aplikasi.&lt;/p&gt;
&lt;h2&gt;Kegiatan ngoding dengan AI&lt;/h2&gt;
&lt;p&gt;Ketika ingin membangun aplikasi atau membuat sesuatu, umumnya dimulai dari memikirkan ide yang ingin dieksekusi, menyusun rencana, membangun aplikasi dan fitur hingga mengelola basis kode yang sudah dikembangkan.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    +----------+        +---------+        +----------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |          |        |         |        |          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    | Diskusi  | -----&gt; |  Susun  | -----&gt; | Eksekusi |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |   Ide    |        | Rencana |        |          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |          |        |         |        |          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    +----------+        +---------+        +----------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                                 |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		                                 |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                                 V&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                           +----------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                           |          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                           |  Kelola  |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                           |          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                           +----------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kita akan fokus pada tahap pertama yaitu diskusi ide dan pembuatan spesifikasi dengan bantuan AI. Tahapan berikutnya akan dibahas di artikel selanjutnya ✌🏼&lt;/p&gt;
&lt;h3&gt;Diskusi ide dengan AI&lt;/h3&gt;
&lt;p&gt;Kita bisa memanfaatkan &lt;em&gt;chatbot&lt;/em&gt; untuk mendiskusikan ide atau memilih ide yang menarik—atau dalam istilah asing disebut &lt;em&gt;brainstorming&lt;/em&gt;. Ketika ide sudah didapat, kita dapat kembali menggunakan chatbot untuk mematangkan ide tersebut.&lt;/p&gt;
&lt;p&gt;Berikut contoh &lt;em&gt;prompt&lt;/em&gt; yang efektif untuk mematangkan ide dengan chatbot seperti ChatGPT, Claude, atau lainnya:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Ask me one question at a time so we can develop a thorough,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    step-by-step spec for this idea. Each question should build on&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    my previous answers, and our end goal is to have a detailed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    specification I can hand off to a developer. Let’s do this&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    iteratively and dig into every relevant detail.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Remember, only one question at a time.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Here’s the idea:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Prompt ini efektif karena meminta AI untuk melakukan pendekatan terstruktur dengan pertanyaan bertahap, sehingga membantu kita mengeksplorasi dan memperjelas ide secara mendalam.
Lanjutkan dengan melemparkan ide yang ingin didiskusikan, misalnya:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    I want to develop a platform to store my ideas in one place.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/claude-300w.webp 300w, https://rizafahmi.com/img/claude-600w.webp 600w, https://rizafahmi.com/img/claude-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/claude-300w.png&quot; alt=&quot;chatbot claude.ai&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;908&quot; srcset=&quot;https://rizafahmi.com/img/claude-300w.png 300w, https://rizafahmi.com/img/claude-600w.png 600w, https://rizafahmi.com/img/claude-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Setelah melakukan diskusi yang mendalam dengan &lt;em&gt;chatbot&lt;/em&gt;, hasil diskusi kemudian perlu dikemas dalam format spesifikasi aplikasi atau &amp;quot;spec&amp;quot; agar dapat didelegasikan kepada developer atau—dalam konteks artikel ini—digunakan sebagai panduan untuk langkah berikutnya dengan meminta bantuan dari asisten koding.&lt;/p&gt;
&lt;p&gt;Untuk mengubah hasil diskusi menjadi dokumen spesifikasi yang lengkap, gunakan prompt seperti ini:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Now that we’ve wrapped up the brainstorming process,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    can you compile our findings into a comprehensive,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    developer-ready specification? Include all relevant&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    requirements, architecture choices, data handling details,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    error handling strategies, and a testing plan so&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    a developer can immediately begin implementation.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hasilnya bisa disimpan ke dalam dokumen teks atau markdown seperti &lt;code&gt;spec.md&lt;/code&gt; misalnya. Berikut contoh spesifikasi yang dihasilkan oleh ChatGPT.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    # Idea Storage Web App Specification&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ## Project Overview&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    A web application designed to capture and retrieve user-generated ideas using a clean and efficient user interface, built with a mobile-first, minimalist, neo-brutalist design approach.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ## Tech Stack&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **TypeScript:** Static typing for enhanced code reliability and maintainability.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **React:** Component-based library for building a responsive front-end.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **Vite:** For fast development and deployment environments.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **LocalStorage:** Client-side storage for persisting user data.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **Tailwind CSS:** Utility-first CSS framework to implement styling.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ## Features and Requirements&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ### User Interface&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    1. **Main Page Components:**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **Idea Input Form:** Simple text input with a submit button.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - [ ] Text input field with a placeholder, e.g., &quot;Enter your idea here...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - [ ] Submit button to save ideas.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **Search Functionality:**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - [ ] Real-time search that filters ideas based on content as the user types.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **Idea Display Area:**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - [ ] Ideas presented as cards beneath the input form.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - [ ] Static display; no edit or delete options.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    2. **Design Guidelines:**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - Mobile-first, responsive layout.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - Light-themed neo-brutalist design using Tailwind CSS.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - Minimalist style with intuitive UI components.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ### Architecture&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **Components:**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - `MainPage.tsx`: Houses the form, search bar, and idea list.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - `IdeaCard.tsx`: Renders each idea in card format.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **State Management:**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - Use React hooks (`useState`, `useEffect`) for managing local state and effects.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ### Data Handling&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **localStorage:**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - Store and retrieve ideas as plain text strings within `localStorage`.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - Maintain a key-value structure for easy access and retrieval (e.g., `ideas` key for storing serialized array of ideas).&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **Custom Hook:**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - `useLocalIdeasStorage`: Handles reading from and writing to `localStorage`.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ### Error Handling&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - Graceful Handling:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **Input Errors:** Prevent submission of empty ideas via form validation.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **Storage Errors:** Handle any potential storage issues with fallbacks and user notifications if localStorage is unavailable or unsupported.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ### Testing Plan&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **Unit Testing:**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - Test components in isolation using a library like Jest and React Testing Library, ensuring correct rendering and functionality.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **Integration Testing:**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - Validate that components work seamlessly together, particularly form input, search functionality, and data storage.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **UI/UX Testing:**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - Ensure responsive and consistent behavior across devices and screen sizes.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - Verify compliance of the UI with design specifications.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - **User Testing:**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - Conduct tests for edge cases, such as large input sizes and rapid successive inputs, to ensure reliability.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ## Deployment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - Use a platform like Netlify or Vercel for easy and continuous deployment.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - Ensure configurations support responsive design and asset optimization.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Artikel kali ini membahas penggunaan AI sebagai asisten dalam proses pengembangan aplikasi, dengan fokus pada tahap awal: diskusi ide dan pembuatan spesifikasi. Kita telah melihat bagaimana chatbot seperti ChatGPT atau Claude dapat berperan sebagai rekan diskusi yang efektif untuk melakukan brainstorming dan mematangkan ide aplikasi.&lt;/p&gt;
&lt;p&gt;Selanjutnya kita fokus pada tahap pertama, yaitu diskusi ide dengan AI beserta contoh konkret bagaimana memanfaatkan &lt;em&gt;chatbot&lt;/em&gt; seperti ChatGPT atau Claude untuk melakukan &lt;em&gt;brainstorming&lt;/em&gt; dan mematangkan ide aplikasi hingga menghasilkan dokumen spesifikasi yang mencakup gambaran umum proyek, teknologi yang digunakan, fitur yang dibutuhkan, arsitektur aplikasi, penanganan data, strategi penanganan kesalahan, dan rencana pengujian—siap untuk diimplementasikan oleh pengembang atau digunakan sebagai panduan untuk langkah berikutnya dengan asisten koding.&lt;/p&gt;
&lt;p&gt;Kita akan membahas bagaimana AI dapat membantu dalam penyusunan rencana pengembangan, eksekusi kode, dan pengelolaan basis kode di artikel berikutnya. Umpan balik sangat berharga bagi saya sebagai pertanda apakah topik ini menarik atau tidak. Silakan tulis pendapat atau saran di kolom komentar di bawah.&lt;/p&gt;
&lt;p&gt;Catatan tambahan, semua contoh &lt;em&gt;prompt&lt;/em&gt; saya catut dari &lt;a href=&quot;https://harper.blog/2025/02/16/my-llm-codegen-workflow-atm/&quot;&gt;artikel super keren dari Pak Harper Reed&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Menyusun Rencana dengan Asisten Ngoding</title>
    <link href="https://rizafahmi.com/catatan/asisten-ngoding-3/"/>
    <updated>2025-06-10T00:00:00Z</updated>
    <pubDate>2025-06-10T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/catatan/asisten-ngoding-3/</id>
    <summary>Seri Asisten Ngoding Produktif dengan Asisten Ngoding Diskusi dan Menulis Spesifikasi dengan AI ➡︎ Menyusun Rencana dengan Asisten Ngoding Desain Antarmuka dengan Asisten Ngoding Menulis Kode dengan Asisten Ngoding…</summary>
    <category term="catatan, ai, agentic-coding, planning"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/asisten-ngoding-3.png"/>
    <content type="html">&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Seri Asisten Ngoding&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding&quot;&gt;Produktif dengan Asisten Ngoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-2&quot;&gt;Diskusi dan Menulis Spesifikasi dengan AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;➡︎ Menyusun Rencana dengan Asisten Ngoding&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-4&quot;&gt;Desain Antarmuka dengan Asisten Ngoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-5&quot;&gt;Menulis Kode dengan Asisten Ngoding&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;Setelah &lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-3/asisten-ngoding-2.md&quot;&gt;di bagian sebelumnya&lt;/a&gt; kita membahas penggunaan AI sebagai asisten untuk diskusi ide dan pembuatan spesifikasi aplikasi, kali ini kita akan fokus memanfaatkan AI untuk menyusun rencana.&lt;/p&gt;
&lt;p&gt;Sering kali, kita tergoda untuk langsung membuka kode editor dan mulai menulis tanpa mempersiapkan rencana terlebih dahulu. Padahal, rencana yang matang adalah kunci keberhasilan pembangunan sebuah aplikasi. Tanpa rencana yang jelas, kita berisiko mengalami kebingungan atau kesalahan di tengah jalan. Bahkan dengan strategi yang sudah matang sekalipun, hasilnya bisa saja meleset. Bayangkan apa yang terjadi jika kita menulis tanpa rencana!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Give me six hours to chop down a tree and I will spend the first four sharpening the axe.&amp;quot; -- Abraham Lincoln&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kini dengan bantuan AI, proses menyusun rencana dapat dilakukan secara lebih efektif. Mari kita eksplorasi caranya di artikel kali ini. Sebagai pengingat, dibawah adalah ilustrasi tahapan dalam membangun aplikasi. Kini kita sampai ke tahapan kedua yaitu menyusun rencana.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    +----------+        +---------+        +----------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |          |        |    ✅   |        |          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    | Diskusi  | -----&gt; |  Susun  | -----&gt; | Eksekusi |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |   Ide    |        | Rencana |        |          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |          |        |         |        |          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    +----------+        +---------+        +----------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                                 |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                                 |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                                 V&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                           +----------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                           |          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                           |  Kelola  |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                           |          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                           +----------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Menyusun Rencana dengan AI&lt;/h3&gt;
&lt;p&gt;Dengan bekal spesifikasi hasil dari proses diskusi ide di artikel sebelumnya, kita dapat meminta bantuan AI untuk menyusun rencana beserta berbagai tahapannya. Untuk tugas ini, disarankan menggunakan model AI yang unggul dalam &lt;em&gt;reasoning&lt;/em&gt;, seperti &lt;strong&gt;ChatGPT-01&lt;/strong&gt;, &lt;strong&gt;DeepSeek DeepThink&lt;/strong&gt;, &lt;strong&gt;Qwen Thinking&lt;/strong&gt;, atau &lt;strong&gt;Gemini Pro 2.5&lt;/strong&gt;. Sepertinya saat ini hampir semua model AI modern memiliki kemampuan ini.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/deepseek-r1-300w.webp 300w, https://rizafahmi.com/img/deepseek-r1-600w.webp 600w, https://rizafahmi.com/img/deepseek-r1-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/deepseek-r1-300w.png&quot; alt=&quot;DeepSeek DeepThink&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;530&quot; srcset=&quot;https://rizafahmi.com/img/deepseek-r1-300w.png 300w, https://rizafahmi.com/img/deepseek-r1-600w.png 600w, https://rizafahmi.com/img/deepseek-r1-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3&gt;Langkah Membuat Rencana&lt;/h3&gt;
&lt;p&gt;Kita dapat memberikan perintah berikut kepada AI untuk menghasilkan rencana eksekusi:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Draft a detailed, step-by-step blueprint for building this project. Then, once you have a solid plan, break it down into small, iterative chunks that build on each other. Look at these chunks and then go another round to break them into smaller steps. Review the results and make sure that the steps are small enough to be implemented safely, but big enough to move the project forward.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Iterate until you feel the steps are correctly sized for this project. From here, you should have the foundation to provide a series of prompts for a code-generation LLM to implement each step. Prioritize best practices and incremental progress, ensuring no big jumps in complexity at any stage. Make sure each prompt builds on the previous steps and ends with integration. No orphan code!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Separate each prompt section using markdown. Each prompt should be tagged as text using code tags to ensure clear communication.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C; SPEC &gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Inti dari perintah diatas&lt;/strong&gt; adalah meminta AI menyusun &lt;em&gt;blueprint&lt;/em&gt; secara terstruktur, memecah rencana menjadi langkah-langkah kecil, lalu menghasilkan &lt;em&gt;prompt&lt;/em&gt; untuk tiap langkah. Prompt ini kemudian dapat digunakan oleh AI Code Editor seperti &lt;em&gt;Copilot&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Hasil dari langkah ini dapat disimpan ke dalam file sebagai panduan. Namun, pastikan untuk membaca dan melakukan penyuntingan jika diperlukan, mengingat AI cenderung memiliki sifat &lt;strong&gt;halusinasi&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Sebagai contoh, hasil dokumen yang dihasilkan oleh model AI &lt;em&gt;reasoning&lt;/em&gt; dapat ditemukan di tautan berikut:
&lt;a href=&quot;https://rizafahmi.com/assets/asisten/prompt_plan.md&quot;&gt;Contoh Dokumen Prompt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Setelah memiliki rencana dan strategi, kita siap melangkah ke tahap eksekusi dan membangun aplikasi. Tunggu bagian selanjutnya di artikel mendatang!&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Referensi&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://rizafahmi.com/catatan/asisten-ngoding-3/asisten-ngoding-2.md&quot;&gt;Artikel sebelumnya tentang diskusi ide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dekontaminasi.substack.com/&quot;&gt;Kumpulan artikel menarik tentang AI dan LLM dalam Bahasa Indonesia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://harper.blog/2025/02/16/my-llm-codegen-workflow-atm/&quot;&gt;My LLM Codegen Workflow ATM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://danieldelaney.net/chat&quot;&gt;Daniel Delaney&#39;s Chat Workflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.deeplearning.ai/courses/build-apps-with-windsurfs-ai-coding-agent&quot;&gt;Build Apps with Windsurf&#39;s AI Coding Agent&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Berkenalan dengan Bahasa Pemrograman Elixir</title>
    <link href="https://rizafahmi.com/catatan/bahasa-fungsional-elixir/"/>
    <updated>2025-01-10T00:00:00Z</updated>
    <pubDate>2025-01-10T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/catatan/bahasa-fungsional-elixir/</id>
    <summary>Tulisan kali ini kita akan membahas tentang bahasa pemrograman Elixir. Elixir adalah bahasa pemrograman fungsional, dinamis, dan mudah dikelola. Berjalan diatas BEAM (Erlang Virtual Machine) yang dikenal tangguh dan…</summary>
    <category term="catatan, elixir, functional-programming, paradigma"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/bahasa-fungsional-elixir.png"/>
    <content type="html">&lt;p&gt;Tulisan kali ini kita akan membahas tentang bahasa pemrograman Elixir. Elixir adalah bahasa pemrograman fungsional, dinamis, dan mudah dikelola.
Berjalan diatas BEAM (Erlang Virtual Machine) yang dikenal tangguh dan biasa digunakan untuk membangun sistem yang terdistribusi, atau hemat sumber daya dan &lt;em&gt;fault-tolerant&lt;/em&gt; sehingga sistem yang dibuat tetap dapat digunaka&lt;a href=&quot;https://rizafahmi.com/catatan/bahasa-fungsional-elixir/&quot;&gt;&lt;/a&gt;n meski terjadi kesalahan atau &lt;em&gt;error&lt;/em&gt;. Istilah kerennya &lt;strong&gt;let it crash!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Setelah membaca tulisan ini, teman-teman akan mendapat gambaran tentang apa itu Elixir, keunggulan dan hal-hal menarik lainnya seputar bahasa pemrograman Elixir.&lt;/p&gt;
&lt;h2&gt;Sejarah Singkat&lt;/h2&gt;
&lt;p&gt;Bahasa fungsional yang sudah cukup matang ini dikembangkan oleh Pak Jose Valim tahun 2012. Saat itu ia mengalami kesulitan melakukan &lt;em&gt;scaling&lt;/em&gt; aplikasi Ruby yang sedang ia kerjakan. Terinspirasi dengan tangguhnya Erlang dan ErlangVM setelah membaca buku &lt;a href=&quot;https://pragprog.com/titles/btlang/seven-languages-in-seven-weeks/&quot; target=&quot;_blank&quot;&gt;7 Languages in 7 Weeks&lt;/a&gt;, ia lantas mengembangkan bahasa modern yang dapat berjalan diatas ErlangVM dengan berbagai alat bantu yang lebih modern.&lt;/p&gt;
&lt;p&gt;Elixir menggunakan paradigma fungsional sehingga kode Elixir menjadi lebih jelas,  transformasi data yang transparan dan mudah diuji. Karena fungsional, melakukan concurrency di Elixir lebih mudah dicapai. Fitur &lt;em&gt;immutability&lt;/em&gt; dalam bahasa fungsional memudahkan kita menjalankan instruksi secara paralel tanpa kendala &lt;em&gt;race condition&lt;/em&gt;, &lt;em&gt;global state&lt;/em&gt; dan sebagainya.&lt;/p&gt;
&lt;p&gt;Dan yang tak kalah penting, Elixir sudah memiliki ekosistem yang lengkap:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;iex&lt;/strong&gt; — Interactive Elixir, REPL. Dapat digunakan untuk belajar, eksperimen dan debugging&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mix&lt;/strong&gt; — Alat bantu untuk kompilasi, testing, generator dan mengelola pustaka tambahan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hex&lt;/strong&gt; — Kumpulan pustaka yang bisa digunakan di proyek Elixir&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;exunit&lt;/strong&gt; — Unit testing framework&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Begitu pula dengan dukungan pustaka (library) dan kerangka kerja (framework) yang menanti untuk dicoba:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phoenix&lt;/strong&gt; — framework modern untuk membangun aplikasi web interaktif, backend API, realtime, dan lengkap.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ecto&lt;/strong&gt; — Alat untuk pemetaan data dan &lt;em&gt;database&lt;/em&gt;. Terinspirasi dari LINQ di ekosistem C#&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nerves&lt;/strong&gt; — Platform dan infrastruktur untuk IoT. Karena Elixir hemat sumber daya, Elixir sangat mumpuni dijalankan di perangkat IoT&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Membrane Framework&lt;/strong&gt; — Framework untuk mengelola multimedia stream, audio video transcoder, dsb&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nx&lt;/strong&gt; — Elixir juga dapat digunakan untuk kebutuhan &lt;em&gt;machine learning&lt;/em&gt; dengan menggunakan Numerical framework yang namanya Nx.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Livebook&lt;/strong&gt; — Alat pencatatan interaktif yang dapat menjalankan kode Elixir dan berkolaborasi secara interaktif.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Tipe data&lt;/h2&gt;
&lt;p&gt;Elixir menyediakan tipe data untuk merepresentasikan angka seperti integer, float. Ada pula tipe data atom yang merepresentasikan dirinya sendiri, string atau binary, charlist, dan boolean.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# String&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;product_name = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;MacBook Pro&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# Integer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;quantity = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;157&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;                &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# Integer in Hex notation (157 in decimal)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;stock_hex = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0x9D&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# Float&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;price = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1299.99&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;                &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# Float in scientific notation (1451.5)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;weight_sci = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1.4515e3&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;          &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# Boolean&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;available? = &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;                &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# Atom&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;category = :electronics          &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# The &#39;None/null/Nil&#39; value&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;discount = &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;nil&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;             &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;IO&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;inspect&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([product_name, quantity, stock_hex, price, weight_sci, available?, category, discount])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Struktur Data&lt;/h3&gt;
&lt;p&gt;Dalam pemrograman fungsional, struktur data memegang peranan yang sangat penting. Pemilihan struktur data dapat menentukan desain aplikasi secara keseluruhan. Elixir menyediakan beberapa struktur data seperti List, Tuple, Map dan Struct.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;message = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Hello, world!&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;words = &lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;split&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(message, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;, &quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;list = [&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]                                        &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# List&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;location = {&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1.5354&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;3.325&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}                              &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# Tuple&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;person = %{name: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Riza&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, active: &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}                 &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# Map&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;IO&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;inspect&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([message, words, list, location, person])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;%{person | active: &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}                                &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# update map&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;IO&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;inspect&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(person)                                      &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# immutable&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;%{active: &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, name: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Riza&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;person = %{person | active: &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}                       &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# rebinding&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;IO&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;inspect&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(person)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Pencocokan Pola&lt;/h3&gt;
&lt;p&gt;Salah satu fitur andalan bahasa pemrograman fungsional yang belum tentu dipunyai oleh bahasa lainnya adalah fitur &lt;strong&gt;pencocokan pola&lt;/strong&gt; atau &lt;em&gt;pattern matching&lt;/em&gt;. Fitur ini akan sangat sering muncul dan digunakan di berbagai kesempatan.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;x = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;22&lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;                                 # `=` adalah pattern matching&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;22&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;x = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;8&lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;                                  # re-binding variable&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;22&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;** (&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;MatchError&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) no match of right hand side value: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;^x&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;8&lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;                                 # pin x ke nilai sebelumnya&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;{:ok, grocery} = {:ok, [&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;sirop&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;es batu&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;cincau&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]}  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[item0, item1, item2] = grocery&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[head | tail] = grocery&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;IO&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;inspect&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(head)                        &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# &quot;sirop&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;IO&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;inspect&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(tail)                        &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# [&quot;es batu&quot;, &quot;cincau&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; grocery &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  [&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;] -&gt; &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;won&#39;t match&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  {&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;sirop&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;es batu&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;cincau&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;} -&gt; &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;won&#39;t match, list vs tuple&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  [&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;sirop&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, item, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;cincau&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;] -&gt; &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;matches &amp;#x26; binds &#39;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;#{&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&#39; to variable item&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;  _&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; -&gt; &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;default&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Modul dan Fungsi&lt;/h3&gt;
&lt;p&gt;Modul dapat membantu mengelompokkan fungsi-fungsi. Fungsi harus didefinisikan didalam modul. Jika ingin mendefinisikan fungsi tanpa modul, dapat menggunakan fungsi anonim, yang tidak membutuhkan nama.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;defmodule&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Calc&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; do&lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;                   # Modul dan Fungsi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(a, b) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    a + b                           &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# implicit return&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;IO&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;inspect&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Calc&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;))          &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# Eksekusi fungsi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;add = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (a, b) -&gt;                  &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# Fungsi anonim&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  a + b&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;IO&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;inspect&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;))              &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# Eksekusi fungsi anonim&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Elixir adalah bahasa yang menarik untuk dicoba. Dengan paradigma fungsional yang juga sangat menarik untuk digunakan. Tulisan ini sudah membahas tentang apa itu bahasa pemrograman Elixir, sejarah singkatnya, dan beberapa topik dasar seperti tipe data, struktur data, pencocokan pola, modul dan fungsi.&lt;/p&gt;
&lt;p&gt;Untuk materi perkenalannya sekian dulu. Ingin bahasan apa di tulisan berikutnya? Berikan masukan untuk materi ini di kolom komentar dibawah.&lt;/p&gt;
&lt;p&gt;Jika teman-teman ingin belajar lebih lengkap dari dokumentasi Elixir, bisa cek playlist video berikut.&lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/videoseries?si=hmi00jPXsoswQiik&amp;amp;controls=0&amp;amp;list=PLTY2nW4jwtG8V_eYUz6qQp1ywP4wN3R4k&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Bisa juga bergabung ke grup telegram &lt;a href=&quot;https://t.me/elixir_id&quot; target=&quot;_blank&quot;&gt;Elixir Indonesia&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>TIL: Menjalankan Observer di Proyek Elixir</title>
    <link href="https://rizafahmi.com/catatan/til-observer-di-proyek-elixir/"/>
    <updated>2024-12-03T00:00:00Z</updated>
    <pubDate>2024-12-03T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/catatan/til-observer-di-proyek-elixir/</id>
    <summary>Observer adalah tampilan grafis untuk observasi sistem Erlang dan Elixir. Menampilkan beberapa informasi penting seperti sistem, aplikasi, supervisor, proses dan lainnya. Untuk menjalankan observer, biasanya dilakukan…</summary>
    <category term="catatan, til, elixir, otp"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/til-observer-di-proyek-elixir.png"/>
    <content type="html">&lt;p&gt;Observer adalah tampilan grafis untuk observasi sistem Erlang dan Elixir. Menampilkan beberapa informasi penting seperti sistem, aplikasi, supervisor, proses dan lainnya. Untuk menjalankan observer, biasanya dilakukan melalui REPL yaitu iEX.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ iex -S mix&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Interactive Elixir (1.17.3) - press Ctrl+C to exit (type h() ENTER for help)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;iex(1)&gt; :observer.start()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;** (UndefinedFunctionError) function :observer.start/0 is undefined (module :observer is not available)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    :observer.start()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    iex:1: (file)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Meskipun observer sudah termasuk kedalam paket Erlang VM, tapi harus didefinisikan kedalam fungsi &lt;code&gt;application()&lt;/code&gt; di file metadata proyek &lt;code&gt;mix.exs&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;defmodule Shortener.MixProject do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  use Mix.Project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  def project do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      app: :shortener,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      version: &quot;0.1.0&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      elixir: &quot;~&gt; 1.17&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      start_permanent: Mix.env() == :prod,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      deps: deps()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  # Run &quot;mix help compile.app&quot; to learn about applications.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  def application do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-       extra_applications: [:logger]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+       extra_applications: [:logger, :wx, :observer, :runtime_tools]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  # Run &quot;mix help deps&quot; to learn about dependencies.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  defp deps do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      {:mix_test_interactive, &quot;~&gt; 4.1&quot;, only: :dev, runtime: false}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Keluar dari REPL dan jalankan kembali.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ iex -S mix&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Erlang/OTP 25 [erts-13.2.2.11] [source] [64-bit] [smp:10:10] [ds:10:10:10] [async-threads:1]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Interactive Elixir (1.17.3) - press Ctrl+C to exit (type h() ENTER for help)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;iex(1)&gt; :observer.start()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dan di desktop akan muncul aplikasi observer tersebut.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/observer-300w.webp 300w, https://rizafahmi.com/img/observer-600w.webp 600w, https://rizafahmi.com/img/observer-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/observer-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;845&quot; srcset=&quot;https://rizafahmi.com/img/observer-300w.png 300w, https://rizafahmi.com/img/observer-600w.png 600w, https://rizafahmi.com/img/observer-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Informasi lebih lanjut tentang observer bisa dicek di dokumentasi &lt;a href=&quot;https://www.erlang.org/doc/apps/observer/observer.html&quot;&gt;Erlang berikut&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Catatan Tentang Paradigma Pemrograman</title>
    <link href="https://rizafahmi.com/catatan/paradigma-pemrograman/"/>
    <updated>2024-10-01T00:00:00Z</updated>
    <pubDate>2024-10-01T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/catatan/paradigma-pemrograman/</id>
    <summary>Dunia pemrograman sangat dinamis perkembangannya. Selalu ada saja hal baru yang muncul kepermukaan. Mulai dari bahasa pemrograman baru, kerangka kerja baru, pustaka baru dan lain sebagainya. Hal ini terjadi salah…</summary>
    <category term="catatan, paradigma, computer-science"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/paradigma-pemrograman.png"/>
    <content type="html">&lt;p&gt;Dunia pemrograman sangat dinamis perkembangannya. Selalu ada saja hal baru yang muncul kepermukaan. Mulai dari bahasa pemrograman baru, kerangka kerja baru, pustaka baru dan lain sebagainya. Hal ini terjadi salah satunya karena ditemukannya masalah-masalah baru yang mungkin belum terpikirkan atau belum pernah terjadi di era sebelumnya.&lt;/p&gt;
&lt;p&gt;Beberapa tahun belakangan kita menjadi saksi munculnya beberapa bahasa pemrograman baru. &lt;a href=&quot;https://www.scala-lang.org/&quot;&gt;Scala&lt;/a&gt;, &lt;a href=&quot;https://clojure.org/&quot;&gt;Clojure&lt;/a&gt;, &lt;a href=&quot;https://groovy-lang.org/&quot;&gt;Groovy&lt;/a&gt; dan &lt;a href=&quot;https://kotlinlang.org/&quot;&gt;Kotlin&lt;/a&gt; yang berkembang dari ekosistem Java yang mengusung paradigma berbasis objek. Dengan Scala, kita dapat menggunakan paradigma fungsional dan paradigma berbasis objek. Clojure mengusung idealisme paradigma fungsional. Groovy dengan tipe dinamisnya, bertolak belakang dengan Java yang bertipe statis.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.swift.org/&quot;&gt;Swift&lt;/a&gt; yang muncul untuk ekosistem Apple sebagai solusi untuk beberapa masalah yang dihadapi para pengembang aplikasi iOS dan macOS yang sebelumnya menggunakan bahasa pemrograman &lt;a href=&quot;https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html&quot;&gt;Objective-C&lt;/a&gt;, turunan dari bahasa C dengan bumbu pemrograman berbasis objek.&lt;/p&gt;
&lt;p&gt;Kecepatan dan performa yang dihasilkan oleh bahasa C dan C++ yang sampai saat ini belum ada tandingannya membuat beberapa pengembang bahasa dan perusahaan terkemuka tertantang untuk menciptakan bahasa pemrograman baru. Google mengembangkan &lt;a href=&quot;https://go.dev/&quot;&gt;bahasa pemrograman Go&lt;/a&gt; yang mengedepankan kemudahan sekaligus performa yang sangat baik. Mozilla juga mengembangkan &lt;a href=&quot;https://www.rust-lang.org/&quot;&gt;bahasa pemrograman Rust&lt;/a&gt; yang memiliki kecepatan mendekati C/C++.&lt;/p&gt;
&lt;h3&gt;Pergeseran Paradigma&lt;/h3&gt;
&lt;p&gt;Paradima pun terjadi pergeseran. Bahasa seperti Go yang menggunakan paradigma berbasis objek, namun berbeda dengan bahasa yang mengusung paradigma berbasis objek seperti Java dan C#. Tidak ada sintaksis &lt;code&gt;class&lt;/code&gt;, tidak mengenal konsep &lt;em&gt;subtype inheritance&lt;/em&gt;, dan lain sebagainya. Go menggunakan paradigma berbasis objek via struktur data Struct.&lt;/p&gt;
&lt;p&gt;Muncul juga gaya pemrograman yang berbeda-beda. Ada gaya imperatif yang menggunakan &lt;em&gt;control flow&lt;/em&gt; seperti kondisi dan perulangan. Lalu ada pula gaya deklaratif yang menggunakan konsep-konsep fungsional seperti pencocokan pola atau &lt;em&gt;pattern matching&lt;/em&gt; alih-alih menggunakan &lt;em&gt;control flow&lt;/em&gt; seperti gaya imperatif. Gaya deklaratif ini cukup populer digunakan untuk membangun antarmuka aplikasi. React di JavaScript, SwiftUI di Swift, dan Jetpack Compose di Kotlin menggunakan gaya deklaratif ini karena sepertinya lebih cocok mendeklarasikan apa yang ingin kita lihat.&lt;/p&gt;
&lt;h3&gt;Perkembangan Perangkat Keras&lt;/h3&gt;
&lt;p&gt;Perkembangan perangkat keras juga menjadi salah satu penyebab munculnya hal-hal baru tersebut. Kecepatan prosesor yang sudah mulai &#39;mentok&#39; dan sulit ditingkatkan menjadi lebih cepat lagi. Namun di sisi lain, jumlah inti prosesor bertambah secara eksponensial menyebabkan perubahan cara mengeksekusi kode agar dapat memanfaatkan &lt;em&gt;multi-core&lt;/em&gt; dari prosesor. Jika sebelumnya jika aplikasi dirasa sudah mulai lambat, kita bisa &lt;em&gt;upgrade&lt;/em&gt; prosesor dengan &lt;em&gt;clock speed&lt;/em&gt; yang lebih tinggi. Sekarang sudah tidak bisa lagi dilakukan karena &lt;em&gt;clock speed&lt;/em&gt; sudah nyaris &#39;mentok&#39;. Tren ini disebut sebagai &lt;a href=&quot;http://www.gotw.ca/publications/concurrency-ddj.htm&quot;&gt;The Free Lunch is Over, A Fundamental Turn Toward Concurrency in Software&lt;/a&gt; yang pertama kali dipopulerkan oleh Herb Sutter. &lt;em&gt;Free lunch&lt;/em&gt; disini maksudnya &lt;em&gt;scaling hardware&lt;/em&gt; (dalam hal ini CPU) sudah tidak semudah sebelumnya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Microprocessor-clock-frequency-data-14-and-trend-300w.webp 300w, https://rizafahmi.com/img/Microprocessor-clock-frequency-data-14-and-trend-600w.webp 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Microprocessor-clock-frequency-data-14-and-trend-300w.png&quot; alt=&quot;Tren CPU Clock Speed&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;600&quot; height=&quot;445&quot; srcset=&quot;https://rizafahmi.com/img/Microprocessor-clock-frequency-data-14-and-trend-300w.png 300w, https://rizafahmi.com/img/Microprocessor-clock-frequency-data-14-and-trend-600w.png 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;
Gambar dikutip dari publikasi karya &lt;a href=&quot;https://www.researchgate.net/publication/338517514_Retrospective_on_VLSI_value_scaling_and_lithography&quot;&gt;Michael L. Rieger&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Concurrency is the next major revolution in how we write software&amp;quot; -- Herb Sutter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Berkembanglah konsep &lt;em&gt;concurrent programming&lt;/em&gt; atau &lt;em&gt;parallel programming&lt;/em&gt; dalam mengembangkan aplikasi, yang memungkinkan kita menggunakan banyak inti prosesor untuk mengeksekusi kode secara bersamaan. Beberapa bahasa mulai mengadopsi hal ini seperti Go dengan goroutine, Elixir dan Erlang dengan processes, dan Kotlin dengan coroutine.&lt;/p&gt;
&lt;p&gt;Kode berikut merupakan gambaran perbedaan antara kode yang belum menggunakan &lt;em&gt;concurrency&lt;/em&gt; dan kode yang memanfaatkkan &lt;em&gt;concurrency&lt;/em&gt; sehingga semua inti prosesor digunakan saat eksekusi kode.&lt;/p&gt;
&lt;h4&gt;Kode Tanpa &lt;em&gt;Concurrency&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;Mari kita coba kode tanpa memanfaatkan &lt;em&gt;concurrency&lt;/em&gt; lalu dibandingkan dengan &lt;em&gt;concurrency&lt;/em&gt;. Kedua kode dibawah dikembangkan menggunakan bahasa Elixir.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;defmodule&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Sequence&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;  # calculate function&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;  # ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; map&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([], &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;_fun&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;), do: []&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; map&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([head | tail], fun), do: [&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;fun&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.(head) | &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(tail, fun)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;IO&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;inspect&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Sequence&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;35&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;36&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;37&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;38&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;39&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;40&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;41&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;], &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; n -&gt; &lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Sequence&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;calculate&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(n) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jika kode diatas dijalankan, akan memakan waktu sekitar 78.33 detik. Hal ini karena proses kalkulasi dijalankan satu-per-satu dan inti prosesor yang digunakan hanya sebagian sedangkan beberapa inti prosesor lainnya &lt;em&gt;nganggur&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/elixir-seq-code-300w.webp 300w, https://rizafahmi.com/img/elixir-seq-code-600w.webp 600w, https://rizafahmi.com/img/elixir-seq-code-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/elixir-seq-code-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;635&quot; srcset=&quot;https://rizafahmi.com/img/elixir-seq-code-300w.png 300w, https://rizafahmi.com/img/elixir-seq-code-600w.png 600w, https://rizafahmi.com/img/elixir-seq-code-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h4&gt;Kode dengan &lt;em&gt;concurrency&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;Sekarang mari kita gunakan kode dengan &lt;em&gt;concurrency&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;defmodule&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Sequence&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; calculate&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;), do: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; calculate&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;), do: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; calculate&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(n), do: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;calculate&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(n - &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) + &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;calculate&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(n - &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; map&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([], &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;_fun&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;), do: []&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; map&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([head | tail], fun), do: [&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;fun&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.(head) | &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(tail, fun)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; pmap&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(collection, fun) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    collection |&gt; &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;spawn_children&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(fun) |&gt; &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;collect_results&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; spawn_children&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(collection, fun) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    collection |&gt; &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; elem -&gt; &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;spawn_child&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(elem, fun) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; spawn_child&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(value, fun) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;    spawn&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;__MODULE__&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, :child, [value, fun, &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;()])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; child&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(value, fun, parent) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;    send&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(parent, {&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;fun&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.(value)})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; collect_results&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(pids) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    pids |&gt; &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; pid -&gt; &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;collect_result_per_pid&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(pid) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; collect_result_per_pid&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(pid) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    receive&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      {&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;^pid&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, result} -&gt; result&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;IO&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;inspect&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;  Sequence&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;pmap&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;35&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;36&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;37&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;38&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;39&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;40&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;41&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;42&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;43&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;44&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;45&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;], &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; n -&gt; &lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Sequence&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;calculate&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(n) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dengan menggunakan fungsi &lt;code&gt;pmap&lt;/code&gt;, iterasi dijalankan secara parallel masing-masing satu proses atau &lt;em&gt;worker&lt;/em&gt; untuk setiap angka yang akan dikalkulasi. Kemudian hasilnya dikumpulkan untuk dikembalikan. Kali ini eksekusinya memakan waktu 32,88 detik saja. Dan seperti gambar dibawah, semua inti prosesor laptop saya ikut bekerja.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/pmap-300w.webp 300w, https://rizafahmi.com/img/pmap-600w.webp 600w, https://rizafahmi.com/img/pmap-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/pmap-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;722&quot; srcset=&quot;https://rizafahmi.com/img/pmap-300w.png 300w, https://rizafahmi.com/img/pmap-600w.png 600w, https://rizafahmi.com/img/pmap-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2&gt;Penutup&lt;/h2&gt;
&lt;p&gt;Sebenarnya ada beberapa lagi paradigma lainnya, dengan berbagai percabangan lainnya. Namun untuk sederhananya kita bisa gunakan pengelompokan seperti ilustrasi berikut.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/paradigma-300w.webp 300w, https://rizafahmi.com/img/paradigma-600w.webp 600w, https://rizafahmi.com/img/paradigma-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/paradigma-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;691&quot; srcset=&quot;https://rizafahmi.com/img/paradigma-300w.png 300w, https://rizafahmi.com/img/paradigma-600w.png 600w, https://rizafahmi.com/img/paradigma-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Kurang tahu ilustrasi ini tepat atau tidak namun cukup masuk akal menurut saya. &lt;a href=&quot;https://blog.favouritejome.dev/the-world-of-programming-paradigms&quot;&gt;Ilustrasi ini dikutip dari artikel berikut&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Menarik kali ya kalau kita bahas paradigma ini lebih lanjut dengan berbagai kelebihan dan kekurangannya masing-masing. Gimana menurut teman-teman? Boleh yuk sampaikan opininya di kolom komentar dibawah ini.&lt;/p&gt;
&lt;p&gt;Dan kalau teman-teman penasaran dengan contoh kode Elixir, boleh cek sesi &lt;em&gt;livestreaming&lt;/em&gt; saya di kanal youtube setiap senin malam.&lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/videoseries?si=H6OGMDRNmTmnIiTz&amp;amp;list=PLTY2nW4jwtG8V_eYUz6qQp1ywP4wN3R4k&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</content>
  </entry>
  
  <entry>
    <title>Catatan tentang NotebookLM</title>
    <link href="https://rizafahmi.com/catatan/notebooklm/"/>
    <updated>2024-10-01T00:00:00Z</updated>
    <pubDate>2024-10-01T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/catatan/notebooklm/</id>
    <summary>NotebookLM sederhananya adalah Retrieval Augmented Generation atau RAG yang diperutukkan bagi pengguna umum atau end user . Jika biasanya untuk menggunakan RAG kita harus lalukan sendiri atau membangun aplikasi dulu.…</summary>
    <category term="catatan, ai, tools"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/notebooklm.png"/>
    <content type="html">&lt;p&gt;NotebookLM sederhananya adalah Retrieval Augmented Generation atau RAG yang diperutukkan bagi pengguna umum atau &lt;em&gt;end user&lt;/em&gt;. Jika biasanya untuk menggunakan RAG kita harus lalukan sendiri atau membangun aplikasi dulu. Dengan NotebookLM kita bisa memasukkan berbagai data: dokumen, teks, tautan hingga video YouTube dan kita bisa bertanya tentang semua data tersebut melalui antarmuka &lt;em&gt;chat&lt;/em&gt;. Ditenagai oleh Gemini 1.5 Pro yang punya konteks besar.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/notebooklm2-300w.webp 300w, https://rizafahmi.com/img/notebooklm2-600w.webp 600w, https://rizafahmi.com/img/notebooklm2-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/notebooklm2-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;970&quot; srcset=&quot;https://rizafahmi.com/img/notebooklm2-300w.png 300w, https://rizafahmi.com/img/notebooklm2-600w.png 600w, https://rizafahmi.com/img/notebooklm2-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Setelah data dari berbagai sumber sudah terkumpul, kita dapat bertanya melalui interface chat. Yang menarik, ada fitur Audio Overview. Jadi kumpulan data tadi disimpulkan dan dibawakan dengan gaya percakapan ala podcast yang dikemas dengan sangat menarik! Dua pembawa acara AI saling diskusi berdasarkan data yang kita unggah.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/notebooklm-300w.webp 300w, https://rizafahmi.com/img/notebooklm-600w.webp 600w, https://rizafahmi.com/img/notebooklm-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/notebooklm-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;850&quot; srcset=&quot;https://rizafahmi.com/img/notebooklm-300w.png 300w, https://rizafahmi.com/img/notebooklm-600w.png 600w, https://rizafahmi.com/img/notebooklm-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Saya mencoba mengunggah versi tulisan dari materi yang &lt;a href=&quot;https://rizafahmi.com/2020/02/03/ekosistemjs/&quot;&gt;saya bahas di keynote pembuka JSDay 2018 lalu&lt;/a&gt; dan inilah hasilnya.&lt;/p&gt;
&lt;p&gt;&lt;audio controls=&quot;&quot; src=&quot;https://rizafahmi.com/assets/media/EkosistemJS.mp3&quot;&gt;&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;https://notebooklm.google.com/notebook/0f32ec16-ae6c-48d6-bfa9-88caeb43aef6/audio&quot;&gt;Lihat hasilnya di NotebookLM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Keren sekali ya. Dari tulisan bisa menjadi percakapan yang menarik seperti ini ya. Sayangnya saat ini baru mendukung bahasa Inggris. Coba kalau bisa bahasa Indonesia, berapa banyak podcast yang bisa dibuat secara otomatis?!&lt;/p&gt;
&lt;p&gt;Sebagai bonus, saya coba masukkan tautan ke halaman utama rizafahmi.com dan dengarkan bagaimana AI memuji berbagai hal yang sudah saya capai berdasarkan halaman utama tersebut.&lt;/p&gt;
&lt;p&gt;&lt;audio controls=&quot;&quot; src=&quot;https://rizafahmi.com/assets/media/rizafahmi.com.mp3&quot;&gt;&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;https://notebooklm.google.com/notebook/5f4e26e0-3f48-4289-8af9-94954da9ae8e/audio&quot;&gt;Lihat hasilnya di NotebookLM&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Gemini API untuk Web Developer</title>
    <link href="https://rizafahmi.com/gemini-web-dev/"/>
    <updated>2023-10-22T00:00:00Z</updated>
    <pubDate>2023-10-22T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/gemini-web-dev/</id>
    <summary>Contoh penggunaan Gemini API untuk web developer</summary>
    <category term="catatan, ai, tools"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/assets/images/gemini-web-dev/mendang-mending.png"/>
    <content type="html">&lt;p&gt;Gemini adalah model Generative AI andalan Google. Sudah dilatih dengan banyak teks, audio dan video dengan berbagai bahasa. Berbeda dengan model lainnya, Gemini dibangun dari awal dengan fitur multimodal, artinya dapat menerima beberapa jenis masukan seperti teks, gambar, kode, dan berbagai jenis file lainnya.&lt;/p&gt;
&lt;p&gt;Ada tiga cara menggunakan Gemini: melalui interface &lt;a href=&quot;https://gemini.google.com/&quot;&gt;gemini.google.com&lt;/a&gt;, Gemini API via Google AI Studio. Cara ketiga dengan menggunakan Vertex AI jika ingin melakukan penggelaran atau &lt;em&gt;deployment&lt;/em&gt; model sendiri via &lt;a href=&quot;https://cloud.google.com/vertex-ai?hl=en&quot;&gt;Google Cloud Platform&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Untuk tutorial kali ini kita akan menggunakan Gemini API melalui &lt;a href=&quot;https://aistudio.google.com/&quot;&gt;Google AI Studio&lt;/a&gt;, dan sama-sama belajar bagaimana menambahkan fitur AI kedalam aplikasi web.&lt;/p&gt;
&lt;h2&gt;Pratinjau&lt;/h2&gt;
&lt;p&gt;Tutorial kali ini kita akan membuat aplikasi dengan AI sebagai bahan utamanya. Kita akan membuat aplikasi mendang-mending, membandingkan satu hal dengan hal lainnya.&lt;/p&gt;
&lt;p&gt;Hasil perbandingan akan dihasilkan oleh AI, dalam hal ini Gemini API.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/mendang-mending-300w.webp 300w, https://rizafahmi.com/img/mendang-mending-600w.webp 600w, https://rizafahmi.com/img/mendang-mending-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/mendang-mending-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;935&quot; srcset=&quot;https://rizafahmi.com/img/mendang-mending-300w.png 300w, https://rizafahmi.com/img/mendang-mending-600w.png 600w, https://rizafahmi.com/img/mendang-mending-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2&gt;Persiapan&lt;/h2&gt;
&lt;p&gt;Di tutorial ini kita akan menggunakan NodeJS versi 18 atau yang lebih baru. Jika belum menginstall NodeJS, silakan download dan install dari &lt;a href=&quot;https://nodejs.org/&quot;&gt;situs resminya&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Kita juga membutuhkan akun Google atau Google Cloud Platform untuk mendapatkan akses ke Gemini API. Jika belum memiliki akun, silakan daftar terlebih dahulu. Untuk memastikan silakan kunjungi &lt;a href=&quot;https://aistudio.google.com/&quot;&gt;AI Studio&lt;/a&gt; dan login dengan akun Google. Hingga tulisan ini dipublikasi, Gemini API lewat Google AI Studio dapat diakses secara gratis dengan batasan tertentu.&lt;/p&gt;
&lt;h2&gt;Membangun Aplikasi Web&lt;/h2&gt;
&lt;h3&gt;Persiapan Proyek&lt;/h3&gt;
&lt;p&gt;Pertama-tama, siapkan terlebih dahulu folder untuk proyek ini sekaligus menjalankan &lt;code&gt;npm init&lt;/code&gt; untuk menandai sebagai proyek NodeJS.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; mendang-mending-gemini&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; mendang-mending-gemini&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; init&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; -y&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lalu buatlah sebuah file yang akan digunakan sebagai server atau backend untuk aplikasi.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;server.js&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Di file ini kita akan membuat server sederhana dengan menggunakan modul &lt;code&gt;http&lt;/code&gt; bawaan NodeJS dengan sebuah route untuk permulaan.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; http&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;http&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; () {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; server&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;http&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;createServer&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; } = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; === &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;/health&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;writeHead&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;OK&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; is 404!`&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;writeHead&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;404&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; port&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;process&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt;PORT&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; || &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;6789&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;`Server running on port &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  server&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;listen&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;port&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;})();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Tambahkan script untuk menjalankan server di &lt;code&gt;package.json&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;mendang-mending-gemini&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;version&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;1.0.0&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;description&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;main&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;scripts&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    &quot;start&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;node server.js&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    &quot;dev&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;node --watch server.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;keywords&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;author&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Riza Fahmi&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;license&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;MIT&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;module&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lalu jalankan server dengan perintah &lt;code&gt;npm start&lt;/code&gt; atau &lt;code&gt;npm run dev&lt;/code&gt;. Jika berhasil, buka browser dan akses &lt;code&gt;http://localhost:6789/health&lt;/code&gt; dan akan muncul tulisan &lt;code&gt;OK&lt;/code&gt; atau bisa dicek juga dengan alat bantu seperti curl dan pastikan mendapatkan hasil &lt;code&gt;OK&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; localhost:6789/health&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;OK⏎&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Membangun &lt;em&gt;Backend&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Mari persiapkan aplikasi dari sisi backend. Untuk &lt;em&gt;route&lt;/em&gt; utama akan menampilkan halaman utama dari aplikasi.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;server.js&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Ketika pengguna mengakses &lt;code&gt;http://localhost:6789/&lt;/code&gt; atau &lt;code&gt;http://localhost:6789/index.html&lt;/code&gt;, kita akan menampilkan halaman utama dari aplikasi yang berasal dari file &lt;code&gt;index.html&lt;/code&gt; sebagai frontend.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;import http from &quot;http&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ import fs from &quot;fs&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(async () =&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    const {url} = request;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    if (url === &quot;/health&quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      response.writeHead(200).end(&quot;OK&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    } else if (url === &quot;/&quot; || url === &quot;/index.html&quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      response.writeHead(200, { &quot;Content-Type&quot;: &quot;text/html&quot; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      response.end(fs.readFileSync(&quot;./public/index.html&quot;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Membangun &lt;em&gt;Frontend&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Untuk sisi frontend, mulai dari yang paling sederhana saja, sebuah halaman &lt;code&gt;index.html&lt;/code&gt; yang didalamnya akan ada CSS dan JavaScript.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;public/index.html&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;CSS dan JavaScript sebagian besar sudah disediakan agar bisa lebih fokus pada bagian Gemini API. Sehingga mudah bila ingin melakukan copy-paste.&lt;/p&gt;
&lt;p&gt;Sebagian besar kode JavaScript bertugas untuk menangani &lt;em&gt;form&lt;/em&gt;, &lt;em&gt;state&lt;/em&gt; dan DOM.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;!&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;DOCTYPE&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; lang&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; charset&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;viewport&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;width=device-width, initial-scale=1.0&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;Aplikasi buat kaum mendang-mending&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    @import&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&#39;https://fonts.upset.dev/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&amp;#x26;display=swap&#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      background-color&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#232946&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      font-family&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: Montserrat, proxima-nova, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;sans-serif&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    body&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      font-size&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;18px&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      line-height&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1.8&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      font-weight&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;400&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      box-sizing&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;border-box&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      padding&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      margin&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    section&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      background-color&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#eebbc3&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      color&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#232946&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      font-size&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1.5rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      font-weight&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;600&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      padding&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2rem&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 1rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      text-align&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;center&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    input&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      font-family&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: Montserrat, proxima-nova, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;sans-serif&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      font-size&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1.5rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      background-color&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;transparent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      border-color&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#fffffe&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      color&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#232946&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      height&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2.5rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      margin-bottom&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0px&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      padding-left&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;20px&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      border&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      border-bottom&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;3px&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; dashed&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; #232323&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      border-radius&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;3px&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      font-weight&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;500&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      font-size&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;16px&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      line-height&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1.4&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      vertical-align&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;middle&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    input&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;:focus&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      outline&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    #topic&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      width&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;36rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    button&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      font-size&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1.25rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      background-color&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#232946&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      color&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#fffffe&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      width&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;80%&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      padding&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.7rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      margin&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      border&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      cursor&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;pointer&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      border-radius&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;3px&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    button:disabled&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      background-color&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#b8c1ec&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    .topic&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      padding-bottom&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.5rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    #topicText&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      text-transform&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;uppercase&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    .options&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      padding-bottom&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.5rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    main&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      margin&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;6rem&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 3rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      padding&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2.5rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      border-radius&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;3px&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      background-color&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#fffffe&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      opacity&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      transform&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;translate3d&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0px&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0px&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0px&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;scale3d&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;rotateX&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0deg&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;rotateY&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0deg&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;rotateZ&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0deg&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;skew&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0deg&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0deg&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      transform-style&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;preserve-3d&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;section&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; placeholder&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Topik untuk dibandingkan...&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; required&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;options&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;mending&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;option1&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;option1&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; required&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      atau &lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;option2&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;option2&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; required&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;action&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;compareButton&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; 👇 mending mana? &lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;section&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;suggestion&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;topicText&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;Topic&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;responseText&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&#39;DOMContentLoaded&#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; () {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Client side&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      suggestion&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;hidden&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      topic&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;focus&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      compareButton&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;disabled&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      option2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&#39;keydown&#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        compareButton&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;disabled&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; === &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&#39;Enter&#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;          await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; runComparison&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      compareButton&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&#39;click&#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;        await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; runComparison&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; runComparison&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      compareButton&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;🤔 mikir dulu...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      compareButton&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;disabled&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;      await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; compare&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;topic&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;trim&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;option1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;trim&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;option2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;trim&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      compareButton&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;👇 mending mana?&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      topic&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;focus&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      compareButton&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;disabled&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; compare&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;topic&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;opt1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;opt2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      option2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;blur&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;      // get something from backend here...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; resetForm&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      topic&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      option1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      option2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      topic&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;focus&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mari alihkan fokus ke baris 148 sampai baris ke-152. Di sini kita akan menambahkan kode JavaScript untuk mengirimkan permintaan ke server kita ketika tombol ditekan untuk membandingkan opsi pertama dengan opsi kedua.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; compare&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;topic&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;opt1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;opt2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  option2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;blur&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;`/compare?topic=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;encodeURIComponent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;topic&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#x26;opt1=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;encodeURIComponent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;opt1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#x26;opt2=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;encodeURIComponent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;opt2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; !== &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;      throw&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; Error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&#39;Unable to get an answer!&#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; result&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      topicText&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;topic&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      responseText&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;insertAdjacentHTML&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&#39;beforeend&#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      suggestion&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;hidden&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;      resetForm&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dari sisi frontend, lakukan pemanggilan ke server dengan menggunakan &lt;code&gt;fetch&lt;/code&gt; ke &lt;em&gt;route&lt;/em&gt; &lt;code&gt;/compare&lt;/code&gt; dengan parameter &lt;code&gt;topic&lt;/code&gt;, &lt;code&gt;opt1&lt;/code&gt; dan &lt;code&gt;opt2&lt;/code&gt;. Hasil dari permintaan ini akan ditampilkan di halaman web.&lt;/p&gt;
&lt;h3&gt;Membangun &lt;em&gt;Backend&lt;/em&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;code&gt;server.js&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Tambahkan &lt;em&gt;route&lt;/em&gt; baru untuk menangani permintaan dari &lt;em&gt;frontend&lt;/em&gt;, &lt;code&gt;/compare&lt;/code&gt; yang akan menerima parameter &lt;code&gt;topic&lt;/code&gt;, &lt;code&gt;opt1&lt;/code&gt; dan &lt;code&gt;opt2&lt;/code&gt;. Untuk saat ini, kita akan mencacah parameter lalu mengembalikan hasilnya.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;import fs from &quot;fs&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;import http from &quot;http&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ function parse_options(options) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   const topic = options[0].split(&quot;=&quot;)[1];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   const opt1 = options[1].split(&quot;=&quot;)[1];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   const opt2 = options[2].split(&quot;=&quot;)[1];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   return { topic, opt1, opt2 };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (async function() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   const server = http.createServer(async function (request, response) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     const {url} = request;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     if (url === &quot;/health&quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       response.writeHead(200).end(&quot;OK&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     } else if (url === &quot;/&quot; || url === &quot;/index.html&quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       response.writeHead(200, {&quot;Content-Type&quot;: &quot;text/html&quot;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       response.end(fs.readFileSync(&quot;./public/index.html&quot;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+    } else if (url.startsWith(&quot;/compare&quot;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      const parsedUrl = new URL(`http://localhost/${url}`);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      const {search} = parsedUrl;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      const options = decodeURIComponent(search.substring(1)).split(&quot;&amp;#x26;&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      const {topic, opt1, opt2} = parse_options(options);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      console.log({ topic, opt1, opt2 });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+      response.writeHead(200).end(JSON.stringify({ topic, opt1, opt2 }));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    } else {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      console.error(`${url} is 404!`);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      response.writeHead(404);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      response.end();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const port = process.env.PORT || 6789;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  console.log(`Server running on port ${port}`);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  server.listen(port);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;})();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Gemini API&lt;/h3&gt;
&lt;p&gt;Untuk mulai menggunakan silakan login dengan akun GCP terlebih dahulu ke &lt;a href=&quot;https://aistudio.google.com/&quot;&gt;https://aistudio.google.com/&lt;/a&gt; lalu menuju ke &lt;a href=&quot;https://aistudio.google.com/app/apikey&quot;&gt;https://aistudio.google.com/app/apikey&lt;/a&gt; atau pilih menu &amp;quot;Get API Key&amp;quot; untuk membuat API Key baru yang akan kita gunakan di kode nantinya.&lt;/p&gt;
&lt;p&gt;Lalu pilih &amp;quot;Create API Key&amp;quot; dan pilih proyek dari GCP sebelumnya. Dan salin API Key untuk nantinya akan dimasukkan kedalam &lt;em&gt;environment variable&lt;/em&gt; atau file &lt;code&gt;.env&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/api-key-300w.webp 300w, https://rizafahmi.com/img/api-key-600w.webp 600w, https://rizafahmi.com/img/api-key-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/api-key-300w.png&quot; alt=&quot;api key&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;689&quot; srcset=&quot;https://rizafahmi.com/img/api-key-300w.png 300w, https://rizafahmi.com/img/api-key-600w.png 600w, https://rizafahmi.com/img/api-key-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;.env&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;API_KEY=ApiKEYDariAIStudio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Agar &lt;code&gt;API_KEY&lt;/code&gt; bisa terbaca di kode &lt;code&gt;server.js&lt;/code&gt; kita perlu mengubah sedikit &lt;em&gt;npm script&lt;/em&gt; yang ada.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;name&quot;: &quot;mendang-mending-gemini&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;version&quot;: &quot;1.0.0&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;description&quot;: &quot;&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;main&quot;: &quot;&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;scripts&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    &quot;start&quot;: &quot;node server.js&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-     &quot;dev&quot;: &quot;NODE_ENV=dev node --watch server.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     &quot;dev&quot;: &quot;NODE_ENV=dev node --watch --env-file=.env server.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;keywords&quot;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;author&quot;: &quot;&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;license&quot;: &quot;MIT&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;type&quot;: &quot;module&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Untuk memastikan &lt;code&gt;API_KEY&lt;/code&gt; sudah dapat dibaca oleh kode backend, mari menjajalnya dengan mencetak &lt;code&gt;API_KEY&lt;/code&gt; di sisi server.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;server.js&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;import fs from &quot;fs&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;import http from &quot;http&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ console.log(`API_KEY: ${process.env.API_KEY}`);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;function parse_options(options) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const topic = options[0].split(&quot;=&quot;)[1];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const opt1 = options[1].split(&quot;=&quot;)[1];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const opt2 = options[2].split(&quot;=&quot;)[1];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  return { topic, opt1, opt2 };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jalankan &lt;code&gt;npm run dev&lt;/code&gt; dan pastikan &lt;code&gt;API_KEY&lt;/code&gt; sudah tercetak di terminal.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;&gt; mendang-mending-gemini@1.0.0 dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;&gt; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;NODE_ENV&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;dev&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; node&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; --watch&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; --env-file=.env&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; server.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;node:97065&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;ExperimentalWarning:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; Watch&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; mode&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; is&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; an&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; experimental&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; feature&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; might&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; change&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; at&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; any&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; time&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;Use&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; `&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; --trace-warnings&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; ...`&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; show&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; where&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; warning&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; was&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; created&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;API_KEY:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; ApiKEYDariAIStudio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;Server&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; running&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; on&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; port&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 6789&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Selanjutnya lakukan instalasi pustaka &lt;code&gt;generative-ai&lt;/code&gt; dari Google melalui &lt;code&gt;npm&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; @google/generative-ai&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;server.js&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Hal pertama yang perlu dilakukan adalah import beberapa fungsi dari pustaka &lt;code&gt;generative-ai&lt;/code&gt; yang baru saja diinstal. Lalu tambahkan fungsi &lt;code&gt;compare&lt;/code&gt; yang akan menerima tiga parameter, yaitu &lt;code&gt;topic&lt;/code&gt;, &lt;code&gt;opt1&lt;/code&gt;, dan &lt;code&gt;opt2&lt;/code&gt; dan akan menghasilkan saran dari Gemini API. Terakhir, eksekusi fungsi &lt;code&gt;compare&lt;/code&gt; ketika permintaan dari &lt;em&gt;frontend&lt;/em&gt; diterima.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;import fs from &quot;fs&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;import http from &quot;http&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ import {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   GoogleGenerativeAI,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   HarmCategory,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   HarmBlockThreshold&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ } from &#39;@google/generative-ai&#39;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ async function compare(topic, opt1, opt2) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   // Generate suggestion&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   const MODEL_NAME = &#39;gemini-1.0-pro&#39;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   const { API_KEY } = process.env;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   if (!API_KEY) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     console.error(&#39;Please provide the API_KEY..&#39;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     return;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   const genAI = new GoogleGenerativeAI(API_KEY);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   const model = genAI.getGenerativeModel({ model: MODEL_NAME });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   const generationConfig = {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     temperature: 0.9,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     topK: 1,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     topP: 1,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     maxOutputTokens: 2048,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   const safetySettings = [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+       category: HarmCategory.HARM_CATEGORY_HARASSMENT,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+       threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+       category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+       threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+       category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+       threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+       category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+       threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   ];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   const parts = [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     {text: `Please choose your answer given by user delimited by triple dash below and give short reason why. You will answer in Bahasa Indonesia.&#92;n&#92;nExample:&#92;nUser: Mending laptop atau rakit pc?&#92;nAsisten: Mending merakit PC, karena:&#92;n&#92;n* Lebih hemat biaya&#92;n* Lebih fleksibel dalam memilih komponen&#92;n* Dapat di-upgrade dengan mudah&#92;n* Lebih cocok untuk kebutuhan spesifik&#92;n&#92;n&#92;n&#92;n---&#92;n&#92;nUser: ${topic} mending ${opt1} atau ${opt2}?`},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   ];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   const result = await model.generateContent({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     contents: [{role: &#39;user&#39;, parts}],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     generationConfig,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     safetySettings&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   const { response } = result;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   return response.text();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;function parse_options(options) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const topic = options[0].split(&quot;=&quot;)[1];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const opt1 = options[1].split(&quot;=&quot;)[1];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const opt2 = options[2].split(&quot;=&quot;)[1];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  return {topic, opt1, opt2};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(async function() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const server = http.createServer(async function(request, response) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    const {url} = request;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    if (url === &quot;/health&quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      response.writeHead(200).end(&quot;OK&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    } else if (url === &quot;/&quot; || url === &quot;/index.html&quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      response.writeHead(200, {&quot;Content-Type&quot;: &quot;text/html&quot;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      response.end(fs.readFileSync(&quot;./public/index.html&quot;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    } else if (url.startsWith(&quot;/compare&quot;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      const parsedUrl = new URL(`http://localhost/${url}`);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      const {search} = parsedUrl;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      const options = decodeURIComponent(search.substring(1)).split(&quot;&amp;#x26;&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      const {topic, opt1, opt2} = parse_options(options);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-       console.log({topic, opt1, opt2});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+       const suggestion = await compare(topic, opt1, opt2);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-       response.writeHead(200).end(JSON.stringify({topic, opt1, opt2}));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+       response.writeHead(200).end(suggestion);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    } else {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      console.error(`${url} is 404!`);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      response.writeHead(404);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      response.end();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const port = process.env.PORT || 6789;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  console.log(`Server running on por ${port}`);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  server.listen(port);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;})();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mari kita bahas beberapa bagian penting dari kode diatas satu-per-satu.&lt;/p&gt;
&lt;h4&gt;Import &lt;code&gt;@google/generative-ai&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  GoogleGenerativeAI&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  HarmCategory&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  HarmBlockThreshold&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;@google/generative-ai&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Fungsi &lt;code&gt;compare&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; compare&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;topic&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;opt1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;opt2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;  // Generate suggestion&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; MODEL_NAME&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&#39;gemini-1.0-pro&#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt;API_KEY&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; } = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;process&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (!&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt;API_KEY&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&#39;Please provide the API_KEY..&#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; genAI&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; GoogleGenerativeAI&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt;API_KEY&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; model&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;genAI&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;getGenerativeModel&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;({ &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;model:&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; MODEL_NAME&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; generationConfig&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    temperature:&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0.9&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    topK:&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    topP:&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    maxOutputTokens:&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 2048&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; safetySettings&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      category:&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; HarmCategory&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt;HARM_CATEGORY_HARASSMENT&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      threshold:&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; HarmBlockThreshold&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt;BLOCK_MEDIUM_AND_ABOVE&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      category:&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; HarmCategory&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt;HARM_CATEGORY_HATE_SPEECH&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      threshold:&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; HarmBlockThreshold&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt;BLOCK_MEDIUM_AND_ABOVE&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      category:&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; HarmCategory&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt;HARM_CATEGORY_SEXUALLY_EXPLICIT&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      threshold:&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; HarmBlockThreshold&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt;BLOCK_MEDIUM_AND_ABOVE&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      category:&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; HarmCategory&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt;HARM_CATEGORY_DANGEROUS_CONTENT&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      threshold:&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; HarmBlockThreshold&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt;BLOCK_MEDIUM_AND_ABOVE&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  ];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; prompt&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;`Please choose your answer given by user delimited by triple dash below and give short reason why. You will answer in Bahasa Indonesia.&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;&#92;n&#92;n&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;Example:&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;&#92;n&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;User: Mending laptop atau rakit pc?&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;&#92;n&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;Asisten: Mending merakit PC, karena:&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;&#92;n&#92;n&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;* Lebih hemat biaya&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;&#92;n&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;* Lebih fleksibel dalam memilih komponen&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;&#92;n&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;* Dapat di-upgrade dengan mudah&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;&#92;n&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;* Lebih cocok untuk kebutuhan spesifik&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;&#92;n&#92;n&#92;n&#92;n&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;---&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;&#92;n&#92;n&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;User: &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;topic&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; mending belajar &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;opt1&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; atau &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;opt2&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;?`&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; parts&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;text:&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; prompt&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  ];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; result&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; model&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;generateContent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    contents:&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; [{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &#39;user&#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;parts&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    generationConfig&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    safetySettings&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt;response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; } = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Berikut langkah-langkah yang dilakukan oleh fungsi &lt;code&gt;compare&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pertama, inisiasi objek &lt;code&gt;genAI&lt;/code&gt; dari &lt;code&gt;GoogleGenerativeAI&lt;/code&gt; &lt;em&gt;class&lt;/em&gt; dengan &lt;code&gt;API_KEY&lt;/code&gt; yang sudah disediakan seperti yang dapat dilihat di baris ke-9.&lt;/li&gt;
&lt;li&gt;Tentukan model yang ingin digunakan. Per tulisan ini dipublikasi, pilihan model yang tersedia melalui API adalah &lt;code&gt;gemini-1.0-pro&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Buat file untuk menampung konfigurasi seperti &lt;code&gt;temperature&lt;/code&gt;, &lt;code&gt;topK&lt;/code&gt;, &lt;code&gt;topP&lt;/code&gt;, &lt;code&gt;maxOutputTokens&lt;/code&gt; dan juga konfigurasi keamanan di baris ke-11 hingga baris ke-35.&lt;/li&gt;
&lt;li&gt;Lalu di baris ke-37 hingga baris ke-41 untuk mempersiapkan teks yang akan dikirim ke Gemini API dengan instruksi spesifik untuk membandingkan dua hal disertai dengan contoh. Salah satu cara efektif untuk &lt;em&gt;prompting&lt;/em&gt; dengan memberikan contoh keluarang yang diinginkan.&lt;/li&gt;
&lt;li&gt;Di baris ke-43 hingga baris ke-47, eksekusi fungsi &lt;code&gt;generateContent&lt;/code&gt; dengan berbagai parameter yang sudah disiapkan dan hasilnya dikembalikan ke &lt;em&gt;frontend&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/render-raw-300w.webp 300w, https://rizafahmi.com/img/render-raw-600w.webp 600w, https://rizafahmi.com/img/render-raw-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/render-raw-300w.png&quot; alt=&quot;hasil mentah&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1170&quot; srcset=&quot;https://rizafahmi.com/img/render-raw-300w.png 300w, https://rizafahmi.com/img/render-raw-600w.png 600w, https://rizafahmi.com/img/render-raw-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3&gt;Menampilkan Hasil sebagai HTML&lt;/h3&gt;
&lt;p&gt;Pabila dijalankan akan menghasilkan seperti ilustrasi diatas. Teks yang dihasilkan Gemini API mengikuti format dengan tanda &lt;code&gt;*&lt;/code&gt; &lt;em&gt;list&lt;/em&gt; dan tidak diikuti dengan baris baru. Hal ini bisa &lt;em&gt;diakalin&lt;/em&gt; dengan menganggap teks yang dihasilkan sebagai markdown dan konversi ke HTML. Mari kita coba dengan melakukan instalasi pustaka &lt;code&gt;marked&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; marked&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Gunakan pustaka &lt;code&gt;marked&lt;/code&gt; untuk mengkonversi teks yang dihasilkan oleh Gemini API menjadi HTML.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;import fs from &quot;fs&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;import http from &quot;http&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;import {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  GoogleGenerativeAI,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  HarmCategory,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  HarmBlockThreshold&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;} from &quot;@google/generative-ai&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ import { parse } from &#39;marked&#39;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;async function compare(topic, opt1, opt2) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  // Generate suggestion&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const MODEL_NAME = &quot;gemini-1.0-pro&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const {API_KEY} = process.env;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  if (!API_KEY) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    console.error(&quot;Please provide the API_KEY..&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    return;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const genAI = new GoogleGenerativeAI(API_KEY);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const model = genAI.getGenerativeModel({model: MODEL_NAME});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const generationConfig = {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    temperature: 0.9,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    topK: 1,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    topP: 1,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    maxOutputTokens: 2048&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const safetySettings = [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      category: HarmCategory.HARM_CATEGORY_HARASSMENT,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  ];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const parts = [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      text: `Please choose your answer given by user delimited by triple dash below and give short reason why. You will answer in Bahasa Indonesia.&#92;n&#92;nExample:&#92;nUser: Mending laptop atau rakit pc?&#92;nAsisten: Mending merakit PC, karena:&#92;n&#92;n* Lebih hemat biaya&#92;n* Lebih fleksibel dalam memilih komponen&#92;n* Dapat di-upgrade dengan mudah&#92;n* Lebih cocok untuk kebutuhan spesifik&#92;n&#92;n&#92;n&#92;n---&#92;n&#92;nUser: ${topic} mending belajar ${opt1} atau ${opt2}?`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  ];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const result = await model.generateContent({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    contents: [{role: &quot;user&quot;, parts}],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    generationConfig,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    safetySettings&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const {response} = result;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  return response.text();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;function parse_options(options) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const topic = options[0].split(&quot;=&quot;)[1];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const opt1 = options[1].split(&quot;=&quot;)[1];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const opt2 = options[2].split(&quot;=&quot;)[1];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  return {topic, opt1, opt2};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(async function() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const server = http.createServer(async function(request, response) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    const {url} = request;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    if (url === &quot;/health&quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      response.writeHead(200).end(&quot;OK&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    } else if (url === &quot;/&quot; || url === &quot;/index.html&quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      response.writeHead(200, {&quot;Content-Type&quot;: &quot;text/html&quot;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      response.end(fs.readFileSync(&quot;./public/index.html&quot;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    } else if (url.startsWith(&quot;/compare&quot;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      const parsedUrl = new URL(`http://localhost/${url}`);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      const {search} = parsedUrl;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      const options = decodeURIComponent(search.substring(1)).split(&quot;&amp;#x26;&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      const {topic, opt1, opt2} = parse_options(options);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      const suggestion = await compare(topic, opt1, opt2);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-       response.writeHead(200).end(suggestion);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+       response.writeHead(200).end(parse(suggestion));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    } else {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      console.error(`${url} is 404!`);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      response.writeHead(404);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      response.end();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  const port = process.env.PORT || 6789;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  console.log(`Server running on por ${port}`);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  server.listen(port);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;})();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/render-html-300w.webp 300w, https://rizafahmi.com/img/render-html-600w.webp 600w, https://rizafahmi.com/img/render-html-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/render-html-300w.png&quot; alt=&quot;render html&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1368&quot; srcset=&quot;https://rizafahmi.com/img/render-html-300w.png 300w, https://rizafahmi.com/img/render-html-600w.png 600w, https://rizafahmi.com/img/render-html-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Jauh lebih baik, kan?! Dan aplikasi kita pun selesai.&lt;/p&gt;
&lt;h2&gt;Penutup&lt;/h2&gt;
&lt;p&gt;Tutorial kali ini memperlihatkan cara mengintegrasikan Gemini API kedalam sebuah aplikasi web. Berikut langkah-langkah yang dilakukan:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Menyiapkan proyek NodeJS.&lt;/li&gt;
&lt;li&gt;Membuat server dengan modul &lt;code&gt;http&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Membuat &lt;em&gt;route&lt;/em&gt; untuk menampilkan halaman utama.&lt;/li&gt;
&lt;li&gt;Mempersiapkan aplikasi di sisi &lt;em&gt;frontend&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Membuat &lt;em&gt;route&lt;/em&gt; baru untuk menangani permintaan dari &lt;em&gt;frontend&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sedangkan untuk integrasi Gemini API, kita melakukan langkah-langkah berikut:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Mendapatkan API Key dari Google AI Studio.&lt;/li&gt;
&lt;li&gt;Instalasi pustaka &lt;code&gt;@google/generative-ai&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Import fungsi yang dibutuhkan dari pustaka tersebut.&lt;/li&gt;
&lt;li&gt;Inisiasi dengan GenerativeAI.&lt;/li&gt;
&lt;li&gt;Pilih model dan berbagai konfigurasi lainnya.&lt;/li&gt;
&lt;li&gt;Eksekusi fungsi &lt;code&gt;generateContent&lt;/code&gt; dengan parameter yang sudah disiapkan.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Kode lengkapnya tersedia di &lt;a href=&quot;https://github.com/rizafahmi/gemini-for-web-dev&quot;&gt;https://github.com/rizafahmi/gemini-for-web-dev&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sekian tutorial penggunaan Gemini API khususnya untuk web developer. Kira-kira kita bikin apalagi ya? Silakan berikan masukan dan saran di kolom komentar. Terima kasih sudah mampir!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Membuat PaaS Sendiri dengan Dokku</title>
    <link href="https://rizafahmi.com/paas-dokku/"/>
    <updated>2023-10-22T00:00:00Z</updated>
    <pubDate>2023-10-22T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/paas-dokku/</id>
    <summary>Bagaimana membuat Platform-as-a-Service (PaaS) sendiri dengan Dokku. Artikel ini akan membahas cara instalasi, konfigurasi dan cara penggelaran atau deployment.</summary>
    <category term="catatan, devops, paas, self-hosting, docker, tutorial"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/assets/images/cloud-day.jpg"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Ini adalah artikel dari materi yang dibawakan di acara Cloud Day Indonesia 2023 beberapa waktu yang lalu.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/cloud-day-300w.webp 300w, https://rizafahmi.com/img/cloud-day-600w.webp 600w, https://rizafahmi.com/img/cloud-day-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/cloud-day-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;800&quot; srcset=&quot;https://rizafahmi.com/img/cloud-day-300w.png 300w, https://rizafahmi.com/img/cloud-day-600w.png 600w, https://rizafahmi.com/img/cloud-day-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h1&gt;Platform as a Service&lt;/h1&gt;
&lt;p&gt;Platform-as-a-service (PaaS) adalah sebuah servis yang menyediakan
infrastruktur komputasi awan atau &lt;em&gt;cloud&lt;/em&gt; namun dikelola sepenuhnya
untuk mengembangkan, dan mengelola aplikasi web. Dengan PaaS, pengembang
aplikasi dapat lebih fokus untuk mengembangkan produk dan fitur tanpa
perlu mengurus infrastruktur fisik seperti server, jaringan, ataupun
basis data atau &lt;em&gt;database&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/PaaS-300w.webp 300w, https://rizafahmi.com/img/PaaS-600w.webp 600w, https://rizafahmi.com/img/PaaS-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/PaaS-300w.png&quot; alt=&quot;Ilustrasi PaaS&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;701&quot; srcset=&quot;https://rizafahmi.com/img/PaaS-300w.png 300w, https://rizafahmi.com/img/PaaS-600w.png 600w, https://rizafahmi.com/img/PaaS-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Dengan PaaS, kita bisa fokus mengembangkan produk dan berbagai fitur dan
mengutamakan produktivitas pengembang aplikasi. Dengan beberapa tahap,
aplikasi yang tadinya berjalan di mesin lokal dapat dinikmati pengguna
di seluruh belahan dunia.&lt;/p&gt;
&lt;h1&gt;Tentang Dokku&lt;/h1&gt;
&lt;p&gt;Dokku adalah sebuah proyek sumber terbuka atau &lt;em&gt;open-source&lt;/em&gt; yang dapat
digunakan untuk membangun PaaS kita sendiri tanpa tergantung kepada
pihak tertentu. Kita dapat melakukan instalasi Dokku di berbagai
penyedia jasa komputasi awan hingga server fisik sekalipun!&lt;/p&gt;
&lt;p&gt;Dikembangkan diatas teknologi kontainer Docker dan http proxy nginx,
pengguna dapat dengan mudah mengelola, mengkonfigurasi, dan melakukan
penggelaran atau &lt;em&gt;deployment&lt;/em&gt; aplikasi web dengan lebih cepat dan
efisien. Selain itu, Dokku juga mendukung &lt;em&gt;auto-scaling&lt;/em&gt;, kompatibel
dengan buildpacks yang juga digunakan Heroku, serta integrasi dengan
layanan komputasi awan seperti AWS, DigitalOcean, GCP dan yang lainnya.&lt;/p&gt;
&lt;p&gt;Karena terbuka, Dokku mewariskan sifat fleksibilitas bila dibutuhkan
kita bisa mengganti arsitektur semau kita. Misalkan, kita ingin
mengganti nginx dengan HAproxy ataupun Traefik.&lt;/p&gt;
&lt;p&gt;Ekosistem Dokku pun terbilang sudah cukup lengkap dengan dukungan
&lt;em&gt;add-ons&lt;/em&gt;. Kita bisa memanfaatkan &lt;em&gt;add-ons&lt;/em&gt; untuk menambahkan basis
data, &lt;em&gt;caching&lt;/em&gt;, &lt;em&gt;messaging queue&lt;/em&gt;, &lt;em&gt;auth&lt;/em&gt; dan banyak lagi.&lt;/p&gt;
&lt;h1&gt;Menjajal Dokku&lt;/h1&gt;
&lt;p&gt;Untuk menjajal Dokku kita bisa siapkan sebuah mesin virtual seperti EC2
dari AWS ataupun servis serupa. Lalu akses server via ssh dan jangan
lupa lakukan update dan upgrade sebelum instalasi Dokku.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;# Contoh jika menggunakan linux ubuntu/debian&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; upgrade&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Selanjutnya lakukan instalasi Dokku seperti yang tertera di
dokumentasinya.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;wget&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; -NP&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; .&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; https://dokku.com/install/v0.31.1/bootstrap.sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; DOKKU_TAG=v0.31.1&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; bash&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; bootstrap.sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lakukan sedikit konfigurasi untuk otorisasi via ssh. Dan Dokku siap
digunakan.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; su&lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt; # act as super user&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;&gt; &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; /home/admin/.ssh/authorized_keys&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; | &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; ssh-keys:add&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; admin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Demo deployment dengan Dokku&lt;/h1&gt;
&lt;p&gt;Sekarang Dokku sudah dapat dijalankan dengan menulis perintah
&lt;code&gt;dokku&lt;/code&gt;{.shell}&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Usage: dokku [--quiet|--trace|--force] COMMAND &amp;#x3C;app&gt; [command-specific-options]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Primary help options, type &quot;dokku COMMAND:help&quot; for more details, or dokku help --all to see all commands.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Commands:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    app-json                 Manage app-json settings for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    apps                     Manage apps&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    builder                  Manage builder settings for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    builder-dockerfile       Manage the dockerfile builder integration for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    builder-lambda           Manage the lambda builder integration for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    builder-null             No-op builder plugin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    builder-pack             Manage the pack builder integration for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    buildpacks               Manage buildpack settings for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    caddy                    Manage the caddy proxy integration&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    certs                    Manage SSL (TLS) certs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    checks                   Manage zero-downtime settings&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    cleanup                  Cleans up exited/dead Docker containers and removes dangling images&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    config                   Manage global and app-specific config vars&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    cron                     Manage scheduled cron tasks&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    docker-options           Manage docker options for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    domains                  Manage domains used by the proxy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    enter                    Enter running app containers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    events                   Manage event logging&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    git                      Manage app deploys via git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    haproxy                  Manage the haproxy proxy integration&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    help                     Print the list of commands&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    logs                     Manage log integration for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    network                  Manage network settings for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    nginx                    Manage the nginx proxy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    openresty                Manage the openresty proxy integration&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    plugin                   Manage installed plugins&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ports                    Manage ports for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    proxy                    Manage the proxy integration for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ps                       Manage app processes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    registry                 Manage registry settings for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    repo                     Manage the app&#39;s repo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    resource                 Manage resource settings for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    run                      Run a one-off process inside a container&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    scheduler                Manage scheduler settings for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    scheduler-docker-local   Manage the docker-local scheduler integration for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    scheduler-null           No-op scheduler plugin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    shell                    Interactive dokku prompt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ssh-keys                 Manage public ssh keys used for deployment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    storage                  Manage mounted volumes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    trace                    Manage trace mode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    traefik                  Manage the traefik proxy integration&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    url                      Show the first URL for an application (compatibility)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    urls                     Show all URLs for an application&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    version                  Print dokku&#39;s version&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Menyiapkan Dokku untuk penggelaran aplikasi&lt;/h2&gt;
&lt;p&gt;Langkah pertama untuk menyiapkan Dokku untuk penggelaran adalah untuk
membuat aplikasi via perintah dokku.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; apps:help&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Usage: dokku apps[:COMMAND]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Manage apps&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Additional commands:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    apps:clone &amp;#x3C;old-app&gt; &amp;#x3C;new-app&gt;   Clones an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    apps:create &amp;#x3C;app&gt;                Create a new app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    apps:destroy &amp;#x3C;app&gt;               Permanently destroy an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    apps:exists &amp;#x3C;app&gt;                Checks if an app exists&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    apps:list                        List your apps&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    apps:lock &amp;#x3C;app&gt;                  Locks an app for deployment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    apps:locked &amp;#x3C;app&gt;                Checks if an app is locked for deployment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    apps:rename &amp;#x3C;old-app&gt; &amp;#x3C;new-app&gt;  Rename an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    apps:report [&amp;#x3C;app&gt;] [&amp;#x3C;flag&gt;]     Display report about an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    apps:unlock &amp;#x3C;app&gt;                Unlocks an app for deployment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jalankan perintah berikut di server.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; apps:create&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; dokku_express&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Creating dokku_express…&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;=====&gt; Global server virtual host not set, disabling app host…&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;dokku app:list&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;=====&gt; My Apps&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;dokku_express&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Menggelar Aplikasi web&lt;/h2&gt;
&lt;p&gt;Dengan asumsi sudah memiliki aplikasi yang siap digelar, dalam contoh
ini adalah sebuah aplikasi Node.js sederhana.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/dokku-app-300w.webp 300w, https://rizafahmi.com/img/dokku-app-600w.webp 600w, https://rizafahmi.com/img/dokku-app-1154w.webp 1154w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/dokku-app-300w.png&quot; alt=&quot;Screenshot aplikasi&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1154&quot; height=&quot;570&quot; srcset=&quot;https://rizafahmi.com/img/dokku-app-300w.png 300w, https://rizafahmi.com/img/dokku-app-600w.png 600w, https://rizafahmi.com/img/dokku-app-1154w.png 1154w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3&gt;Mengirimkan kode ke Dokku&lt;/h3&gt;
&lt;p&gt;Kirimkan kode yang ingin digelar ke server Dokku via git.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; remote&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; dokku@&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;ip.add&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;r&gt;&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;:landing&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; push&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dan, bukan sulap bukan sihir secara otomatis Dokku dapat mendeteksi
aplikasi kita, yang dibangun dengan NodeJS dan menyiapkan platform untuk
penggelaran lengkap dengan versi dan &lt;em&gt;dependencies&lt;/em&gt; yang sesuai.&lt;/p&gt;
&lt;h2&gt;Konfigurasi Domain/subdomain&lt;/h2&gt;
&lt;p&gt;Kembali ke Dokku server, mari sekarang kita konfigurasi domain/subdomain
agar aplikasi yang baru digelar dapat diakses dengan domain yang sudah
disiapkan.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/dokku-route53-300w.webp 300w, https://rizafahmi.com/img/dokku-route53-600w.webp 600w, https://rizafahmi.com/img/dokku-route53-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/dokku-route53-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;703&quot; srcset=&quot;https://rizafahmi.com/img/dokku-route53-300w.png 300w, https://rizafahmi.com/img/dokku-route53-600w.png 600w, https://rizafahmi.com/img/dokku-route53-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Jika teman-teman memiliki domain bisa lakukan konfigurasi via Route 53.
Dan jika belum memiliki domain aplikasi dapat diakses via public ip
address yang bisa didapat di EC2.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; domains:report&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;=====&gt; landing domains information&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Domains app enabled: false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Domains app vhosts:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Domains global enabled: false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Domains global vhosts:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; domains:add-global&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;ip.add&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;r&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Added &amp;#x3C;ip.addr&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; domains:add&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; dokku_express&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;ip.add&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;r&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Added &amp;#x3C;ip.addr&gt; to dokku_express&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Configuring &amp;#x3C;ip.addr&gt;… (using build-in template)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Creating http nginx.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Reloading nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; domains:report&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;=====&gt; dokku_express domains information&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Domains app enabled: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Domains app vhosts: &amp;#x3C;ip.addr&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Domains global enabled: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Domains global vhosts: &amp;#x3C;ip.addr&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dan sekarang aplikasi kita sudah dapat diakses via public ip address 🎉&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/dokku-ip-addr-300w.webp 300w, https://rizafahmi.com/img/dokku-ip-addr-600w.webp 600w, https://rizafahmi.com/img/dokku-ip-addr-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/dokku-ip-addr-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;716&quot; srcset=&quot;https://rizafahmi.com/img/dokku-ip-addr-300w.png 300w, https://rizafahmi.com/img/dokku-ip-addr-600w.png 600w, https://rizafahmi.com/img/dokku-ip-addr-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3&gt;Subdomain&lt;/h3&gt;
&lt;p&gt;Aplikasi yang digelar ke Dokku bisa lebih dari satu tentunya. Kita bisa
memanfaatkan konfigurasi subdomain untuk mengarahkan satu aplikasi ke
subdomain tertentu. Misalnya kita ingin mengarahkan aplikasi
&lt;code&gt;dokku_express&lt;/code&gt; kita ke subdomain &lt;a href=&quot;https://express.wiraku.dev/&quot;&gt;https://express.wiraku.dev&lt;/a&gt;. Tentunya
kita harus memiliki domain wiraku.dev terlebih dahulu.&lt;/p&gt;
&lt;p&gt;Dengan bantuan Route 53 dari AWS kita bisa mengarahkan domain yang kita
miliki ke ip address di EC2 tempat dimana servis Dokku berada. Lalu kita
bisa melakukan konfigurasi domain dan subdomain via perintah &lt;code&gt;dokku&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/dokku-route-53-2-300w.webp 300w, https://rizafahmi.com/img/dokku-route-53-2-600w.webp 600w, https://rizafahmi.com/img/dokku-route-53-2-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/dokku-route-53-2-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;796&quot; srcset=&quot;https://rizafahmi.com/img/dokku-route-53-2-300w.png 300w, https://rizafahmi.com/img/dokku-route-53-2-600w.png 600w, https://rizafahmi.com/img/dokku-route-53-2-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Lakukan langkah berikut untuk mengembalikan konfigurasi domain ke awal
lagi.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; domains:clear-global&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Clearing global domains&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; domains:clear&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; dokku_express&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;=====&gt; Global server virtual host not set, disabling vhosts...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; No port set, setting to random open high port&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Random port 40211&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Creating http nginx.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Reloading nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Cleared domains in dokku_express&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; domains:report&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;=====&gt; landing domains information&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Domains app enabled:    false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Domains app vhosts:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Domains global enabled: false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Domains global vhosts:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kemudian lakukan konfigurasi kembali untuk domain dan subdomain pilihan.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; domains:set-global&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; wiraku.dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Added wiraku.dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; domains:set&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; dokku_express&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; express.wiraku.dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Set wiraku.dev for dokku_express&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Configuring dokku_express.wiraku.dev... (using template)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Creating http nginx.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Reloading nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; domains:report&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;=====&gt; dokku_express domains information&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Domains app enabled:    true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Domains app vhosts:     express.wiraku.dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Domains global enabled: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       Domains global vhosts:  wiraku.dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Karena satu dan lain hal, untuk mengakses halaman web dengan domain
sekarang kudu aman, kita harus menyediakan ssl certificate atau via
https. Sebelum itu, mari pastikan subdomain sudah sesuai dengan bantuan
&lt;code&gt;curl&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; http://express.wiraku.dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;!&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;DOCTYPE&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; lang&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;Deploy with dokku&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;Deploy with dokku&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;App version: 0.0.3&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tapi tenang saja, Dokku punya solusinya dengan bantuan &lt;em&gt;plugin&lt;/em&gt;
letsencrypt yang merupakan salah satu &lt;em&gt;plugin&lt;/em&gt; resmi yang dikembangkan
langsung oleh tim Dokku.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; su&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; plugin:install&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; https://github.com/dokku/dokku-letsencrypt.git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Cloning into &#39;letsencrypt&#39;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;remote: Enumerating objects: 1103, done.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;remote: Counting objects: 100% (434/434), done.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Resolving deltas: 100% (703/703), done.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Plugin letsencrypt enabled&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Adding user dokku to group adm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;exit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dan sekarang &lt;em&gt;plugin&lt;/em&gt; letsencrypt sudah siap digunakan. Pekerjaan yang
cukup menjengkelkan memang untuk melakukan ini semua secara manual.
Belum lagi untuk proses memperpanjang sertifikat. Dengan &lt;em&gt;plugin&lt;/em&gt; ini,
bahkan kita bisa lakukan perpanjangan secara otomatis!&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; letsencrypt:help&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Usage: dokku letsencrypt[:COMMAND]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Manage the letsencrypt integration&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Additional commands:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    letsencrypt:active &amp;#x3C;app&gt;                     Verify if letsencrypt is active for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    letsencrypt:auto-renew [&amp;#x3C;app&gt;]               Auto-renew app if renewal is necessary&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    letsencrypt:cleanup &amp;#x3C;app&gt;                    Remove stale certificate directories for app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    letsencrypt:cron-job [--add --remove]        Add or remove a cron job that periodically calls auto-renew.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    letsencrypt:disable &amp;#x3C;app&gt;                    Disable letsencrypt for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    letsencrypt:enable &amp;#x3C;app&gt;                     Enable or renew letsencrypt for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    letsencrypt:help                             Display letsencrypt help&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    letsencrypt:list                             List letsencrypt-secured apps with certificate expiry times&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    letsencrypt:revoke &amp;#x3C;app&gt;                     Revoke letsencrypt certificate for app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    letsencrypt:set &amp;#x3C;app&gt; &amp;#x3C;property&gt; (&amp;#x3C;value&gt;)   Set or clear a letsencrypt property for an app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jalankan perintah &lt;code&gt;dokku letsencrypt:enable&lt;/code&gt; untuk mengizinkan subdomain
&lt;code&gt;express&lt;/code&gt; dijalankan via https.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dokku&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; letsencrypt:set&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; --global&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; email&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;email@domain.co&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;m&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;=====&gt; Setting email to &amp;#x3C;email@domain.com&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;dokku letsencrypt:enable express&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;=====&gt; Enabling letsencrypt for express&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Enabling ACME proxy for express...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Getting letsencrypt certificate for express via HTTP-01&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;         - Domain &#39;express.wiraku.dev&#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;No key found for account &amp;#x3C;email@domain.com&gt;. Generating a P256 key.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Saved key to /certs/accounts/acme-v02.api.letsencrypt.org/&amp;#x3C;email@domain.com&gt;/keys...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[INFO] acme: Registering account for &amp;#x3C;email@domain.com&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Certificate retrieved successfully.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Installing let&#39;s encrypt certificates&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Configuring express.wiraku.dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-----&gt; Done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/dokku-ssl-complete-300w.webp 300w, https://rizafahmi.com/img/dokku-ssl-complete-600w.webp 600w, https://rizafahmi.com/img/dokku-ssl-complete-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/dokku-ssl-complete-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;716&quot; srcset=&quot;https://rizafahmi.com/img/dokku-ssl-complete-300w.png 300w, https://rizafahmi.com/img/dokku-ssl-complete-600w.png 600w, https://rizafahmi.com/img/dokku-ssl-complete-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h1&gt;Fitur ekstra&lt;/h1&gt;
&lt;p&gt;Ada banyak lagi fitur tambahan dari Dokku, baik &lt;em&gt;plugin&lt;/em&gt; resmi yang
dikembangkan tim Dokku langsung ataupun yang dikembangkan oleh
komunitas. Sebut saja basis data seperti postgresql, &lt;em&gt;caching&lt;/em&gt; seperti
redis, hingga alat seperti Grafana pun sudah tersedia.&lt;/p&gt;
&lt;p&gt;Ada juga fitur tambahan seperti antarmuka berbasis web sehingga proses
administrasi yang tadinya kita jalankan via terminal dapat dilakukan via
antarmuka web.&lt;/p&gt;
&lt;h1&gt;Kesimpulan&lt;/h1&gt;
&lt;p&gt;Di artikel ini kita sudah membahas tentang apa itu PaaS, tentang Dokku
dan bagaimana cara instalasi Dokku di server AWS, melakukan konfigurasi
dan demo singkat penggelaran dengan Dokku. Kita juga sudah melakukan
konfigurasi domain dan subdomain yang ternyata cukup sederhana.&lt;/p&gt;
&lt;p&gt;Dengan adanya Dokku dan beberapa servis serupa, kita dapat membangun
Platform-as-a-Service (PaaS) sendiri baik untuk digunakan untuk
keperluan pribadi ataupun untuk meraup keuntungan.&lt;/p&gt;
&lt;h1&gt;Referensi&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://railsnotes.xyz/blog/deploying-ruby-on-rails-with-dokku-redis-sidekiq-arm-docker-hetzner&quot;&gt;Deploy RoR with
Dokku&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/geekculture/how-to-create-a-saas-web-application-part-3-setting-up-the-dev-environment-dokku-53032ed26e2b&quot;&gt;Deploy SaaS app with
Dokku&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Membangun Tampilan Web dengan HTML, CSS &amp; JS</title>
    <link href="https://rizafahmi.com/tampilan-web/"/>
    <updated>2023-05-26T00:00:00Z</updated>
    <pubDate>2023-05-26T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/tampilan-web/</id>
    <summary>Berikut adalah materi tertulis untuk acara workshop di Surabaya yang diselenggarakan Mei 2023. Prasarat Untuk mengikuti materi ini, teman-teman membutuhkan beberapa alat berikut: NodeJS versi 18 atau yang lebih baru…</summary>
    <category term="catatan, web, tutorial"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/aplikasi-web.png"/>
    <content type="html">&lt;p&gt;&lt;small style=&quot;color: rgba(252,252,252,0.5);&quot;&gt;&lt;em&gt;Berikut adalah materi tertulis untuk acara workshop di Surabaya yang diselenggarakan Mei 2023.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;h1&gt;Prasarat&lt;/h1&gt;
&lt;p&gt;Untuk mengikuti materi ini, teman-teman membutuhkan beberapa alat berikut:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nodejs.org/en&quot;&gt;NodeJS versi 18&lt;/a&gt; atau yang lebih baru&lt;/li&gt;
&lt;li&gt;Kode editor seperti &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VS Code&lt;/a&gt;, &lt;a href=&quot;https://www.sublimetext.com/&quot;&gt;Sublime&lt;/a&gt; dll&lt;/li&gt;
&lt;li&gt;Web browser seperti &lt;a href=&quot;https://www.google.com/chrome/index.html&quot;&gt;Chrome&lt;/a&gt;, &lt;a href=&quot;https://www.mozilla.org/en-US/firefox/new/&quot;&gt;Firefox&lt;/a&gt;, dll&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Persiapan&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; /Users/riza/playground/webscrape-tutorial&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;ngrok&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; http&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 8080&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ujicoba dulu...&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; localhost:8080/followers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Pengantar&lt;/h1&gt;
&lt;p&gt;Kesempatan kali ini kita akan membangun halaman web dengan HTML, CSS dan JavaScript. Dimuai dari tanpa menggunakan &lt;em&gt;framework&lt;/em&gt; hingga bertahap diubah dengan memperkenalkan &lt;em&gt;framework&lt;/em&gt;. Di akhir sesi diharapkan teman-teman yang mengikuti sesi ini sudah dapat melakukan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mempersiapkan proyek&lt;/li&gt;
&lt;li&gt;Mempersiapkan halaman HTML&lt;/li&gt;
&lt;li&gt;Menambahkan CSS&lt;/li&gt;
&lt;li&gt;Menambahkan beberapa fungsi dengan JavaScript&lt;/li&gt;
&lt;li&gt;Bonus: &lt;em&gt;Rewrite&lt;/em&gt; ke &lt;em&gt;framework&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Persiapan Proyek&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; webapp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; webapp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;code&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Halaman HTML&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;!&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;doctype&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; lang&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; charset&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; http-equiv&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;X-UA-Compatible&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;IE=edge&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;viewport&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;width=device-width, initial-scale=1.0&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;link&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; rel&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;style.css&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;Web App&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;header&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;Web Dashboard&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;header&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;media&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;media-name&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;Twitter&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;media-followers&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;5,320&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;media-label&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;followers&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;      &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;footer&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;&amp;#x26;copy;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; 2023 HACKTIV8 🦊&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;footer&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; live-server&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Menambahkan CSS&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;style.css&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;:root&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  --bg_main&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#0a1f44&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  --text_light&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#fff&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  --text_med&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#53627c&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  --text_dark&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#1e2432&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  --red&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#ff1e42&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  --darkred&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#c3112d&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  --orange&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#ff8c00&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  margin&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  padding&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  box-sizing&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;border-box&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;normal&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  font&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;    1rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1.3&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;Roboto&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;    sans-serif&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  background&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--bg_main&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  color&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--text_dark&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  padding&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;50px&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;header&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &gt; &lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;bold&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  font-size&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;4rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  letter-spacing&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.02em&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  padding&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 30px&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  color&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--text_light&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.media&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  position&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;relative&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  padding&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;40px&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 10%&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  border-radius&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;20px&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  background&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--text_light&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  color&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--text_med&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  width&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;35%&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.media-name&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  font-size&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1.5rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.media-followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  font-size&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;bold&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.media-label&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  color&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--text_med&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;footer&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  text-align&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;center&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  font-size&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1rem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  color&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--text_light&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  margin-top&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;40px&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;footer&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; span&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  color&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--red&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Menambahkan JavaScript&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;!DOCTYPE html&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;html lang=&quot;en&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;head&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;meta charset=&quot;UTF-8&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;title&gt;Web App&amp;#x3C;/title&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;/head&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;body&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;header&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     &amp;#x3C;h1&gt;Web Dashboard&amp;#x3C;/h1&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;/header&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;main&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     &amp;#x3C;div class=&quot;media&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       &amp;#x3C;div class=&quot;media-name&quot;&gt;Twitter&amp;#x3C;/div&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       &amp;#x3C;h2 class=&quot;media-followers&quot;&gt;5,320&amp;#x3C;/h2&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;       &amp;#x3C;span class=&quot;media-label&quot;&gt;followers&amp;#x3C;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     &amp;#x3C;/div&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;/main&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;footer&gt;&amp;#x26;copy; 2023 HACKTIV8 🦊&amp;#x3C;/footer&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   &amp;#x3C;script src=&quot;app.js&quot;&gt;&amp;#x3C;/script&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;/body&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;/html&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;code&gt;app.js&lt;/code&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; getData&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;https://blabla.ngrok.io/followers&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt;followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; } = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; getData&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;    render&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; render&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; followersEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;querySelector&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;.media-followers&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  followersEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;formatNumber&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; formatNumber&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;num&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; formatter&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; Intl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;NumberFormat&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;id-ID&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; formatter&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;format&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;num&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Backend&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; init&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; -y&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; express@5.0.0-beta.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;webapp-tutorial&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;version&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;0.0.1&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;description&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;main&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;app.js&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;scripts&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    &quot;test&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;echo &lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;&#92;&quot;&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;Error: no test specified&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;&#92;&quot;&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#x26;&amp;#x26; exit 1&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    &quot;start&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;node server.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;keywords&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;author&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Riza Fahmi &amp;#x3C;rizafahmi@gmail.com&gt; (https://rizafahmi.com/)&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;license&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;MIT&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;dependencies&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    &quot;express&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;5.0.0-beta.1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  &quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;module&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;code&gt;server.js&lt;/code&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; express&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;express&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;path&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; app&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;express&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;app&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;req&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;res&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  res&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;sendFile&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;resolve&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;index.html&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;app&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;listen&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;3000&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; () {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Example app listening on port 3000!&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Refactor Folder&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; public&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;│  &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; ├──&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; app.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;│  &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; ├──&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; index.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;│  &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; └──&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; style.css&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; package.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; pnpm-lock.yaml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;└──&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; server.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;server.js&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;import express from &#39;express&#39;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;import path from &#39;path&#39;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;const app = express();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ app.use(express.static(&#39;public&#39;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;app.get(&#39;/&#39;, function (req, res) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;- res.sendFile(path.resolve(&#39;index.html&#39;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ res.sendFile(path.resolve(&#39;public/index.html&#39;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;app.listen(3000, function () {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  console.log(&#39;Example app listening on port 3000!&#39;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Menambahkan Media Sosial Lainnya&lt;/h2&gt;
&lt;h3&gt;Statis/Hardcoded/manual: &lt;code&gt;app.js&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; render&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; mainEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;querySelector&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;main&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; mediaEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;createElement&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;div&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  mediaEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;className&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;media&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; nameEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;createElement&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;div&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  nameEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;className&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;media-name&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  nameEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;media&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  mediaEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;nameEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; followerEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;createElement&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;h2&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  followerEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;className&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;media-followers&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  followerEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;formatNumber&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  mediaEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;followerEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; labelEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;createElement&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;span&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  labelEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;className&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;media-label&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  labelEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;followers&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  mediaEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;labelEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  mainEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;mediaEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;!DOCTYPE html&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;html lang=&quot;en&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;head&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;meta charset=&quot;UTF-8&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;title&gt;Web App&amp;#x3C;/title&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;/head&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;body&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;header&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     &amp;#x3C;h1&gt;Web Dashboard&amp;#x3C;/h1&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;/header&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;main&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-     &amp;#x3C;div class=&quot;media&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-       &amp;#x3C;div class=&quot;media-name&quot;&gt;Twitter&amp;#x3C;/div&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-       &amp;#x3C;h2 class=&quot;media-followers&quot;&gt;5,320&amp;#x3C;/h2&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-       &amp;#x3C;span class=&quot;media-label&quot;&gt;followers&amp;#x3C;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-     &amp;#x3C;/div&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;/main&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   &amp;#x3C;footer&gt;&amp;#x26;copy; 2023 HACKTIV8 🦊&amp;#x3C;/footer&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;/body&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;/html&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;code&gt;style.css&lt;/code&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; :root {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   --bg_main: #0a1f44;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   --text_light: #fff;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   --text_med: #53627c;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   --text_dark: #1e2432;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   --red: #ff1e42;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   --darkred: #c3112d;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   --orange: #ff8c00;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; * {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   margin: 0;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   padding: 0;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   box-sizing: border-box;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   font-weight: normal;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; body {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   font: 1rem/1.3 &#39;Roboto&#39;, sans-serif;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   background: var(--bg_main);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   color: var(--text_dark);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   padding: 50px;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; header &gt; h1 {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   font-weight: bold;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   font-size: 4rem;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   letter-spacing: 0.02em;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   padding: 0 0 30px 0;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   color: var(--text_light);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; .media {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   position: relative;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   padding: 40px 10%;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   border-radius: 20px;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   background: var(--text_light);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   color: var(--text_med);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   width: 35%;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; .media-name {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   font-size: 1.5rem;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   text-transform: capitalize;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; .media-followers {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   font-size: 2rem;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   font-weight: bold;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; .media-label {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   color: var(--text_med);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; footer {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   text-align: center;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   font-size: 1rem;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   color: var(--text_light);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   margin-top: 40px;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; footer span {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   color: var(--red);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Dinamis: &lt;code&gt;app.js&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; render&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; mainEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;querySelector&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;main&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; += &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; mediaEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;createElement&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;div&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    mediaEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;className&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;media&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; nameEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;createElement&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;div&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    nameEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;className&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;media-name&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    nameEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;media&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    mediaEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;nameEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; followerEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;createElement&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;h2&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    followerEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;className&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;media-followers&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    followerEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;formatNumber&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    mediaEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;followerEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; labelEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;createElement&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;span&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    labelEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;className&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;media-label&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    labelEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;followers&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    mediaEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;labelEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    mainEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;mediaEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;code&gt;style.css&lt;/code&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; :root {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   --bg_main: #0a1f44;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   --text_light: #fff;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   --text_med: #53627c;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   --text_dark: #1e2432;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   --red: #ff1e42;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   --darkred: #c3112d;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   --orange: #ff8c00;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; * {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   margin: 0;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   padding: 0;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   box-sizing: border-box;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   font-weight: normal;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; body {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   font: 1rem/1.3 &#39;Roboto&#39;, sans-serif;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   background: var(--bg_main);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   color: var(--text_dark);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   padding: 50px;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; header &gt; h1 {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   font-weight: bold;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   font-size: 4rem;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   letter-spacing: 0.02em;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   padding: 0 0 30px 0;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   color: var(--text_light);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ main {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   display: flex;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   flex-wrap: wrap;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   gap: 24px;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; .media {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   position: relative;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   padding: 40px 10%;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   border-radius: 20px;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   background: var(--text_light);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   color: var(--text_med);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   width: 35%;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; .media-name {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   font-size: 1.5rem;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   text-transform: capitalize;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; .media-followers {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   font-size: 2rem;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   font-weight: bold;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; .media-label {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   color: var(--text_med);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; footer {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   text-align: center;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   font-size: 1rem;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   color: var(--text_light);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   margin-top: 40px;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; footer span {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   color: var(--red);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Menggunakan Framework&lt;/h2&gt;
&lt;h3&gt;Rewrite ke Web Components&lt;/h3&gt;
&lt;h4&gt;Pengantar&lt;/h4&gt;
&lt;p&gt;Adalah framework native yang didukung hampir semua browser modern.
Kode dapat lebih modular dan komponen yang dibuat dapat digunakan berkali-kali.
Performa tentu yang paling bagus karena sudah didukung web browser secara native tanpa perlu menambahkan pustaka atau kerangka kerja tambahan lagi.
Terdiri dari empat teknologi utama: ES Module, Custom Elements, Shadow DOM, dan HTML Template.&lt;/p&gt;
&lt;h3&gt;Web Components Pertama&lt;/h3&gt;
&lt;h4&gt;Custom Components: &lt;code&gt;footer-component.js&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; FooterComponent&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; extends&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; HTMLElement&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;  connectedCallback&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;innerHTML&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;`&amp;#x3C;footer&gt;&amp;#x26;copy; 2023 HACKTIV8 🦊&amp;#x3C;/footer&gt;`&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;customElements&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;define&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;footer-component&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;FooterComponent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;!&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;doctype&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; lang&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; charset&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; http-equiv&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;X-UA-Compatible&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;IE=edge&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;viewport&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;width=device-width, initial-scale=1.0&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;link&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; rel&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;style.css&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;Web App&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;header&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;Web Dashboard&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;header&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;media&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;media-name&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;Twitter&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;media-followers&quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;followers&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;5,320&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;media-label&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;followers&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;      &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;footer-component&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;footer-component&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;app.js&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;footer-component.js&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Demo Web Component&lt;/h3&gt;
&lt;h4&gt;ES Module: &lt;code&gt;index.html&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;!DOCTYPE html&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;html lang=&quot;en&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;head&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     &amp;#x3C;meta charset=&quot;UTF-8&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     &amp;#x3C;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     &amp;#x3C;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     &amp;#x3C;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     &amp;#x3C;title&gt;Web App&amp;#x3C;/title&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;/head&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;body&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     &amp;#x3C;header&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;         &amp;#x3C;h1&gt;Web Dashboard&amp;#x3C;/h1&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     &amp;#x3C;/header&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     &amp;#x3C;div id=&quot;root&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+         &amp;#x3C;followers-count&gt;&amp;#x3C;/followers-count&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     &amp;#x3C;/div&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     &amp;#x3C;footer-component&gt;&amp;#x3C;/footer-component&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-     &amp;#x3C;script src=&quot;app.js&quot;&gt;&amp;#x3C;/script&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     &amp;#x3C;script src=&quot;app.js&quot; type=&quot;module&quot;&gt;&amp;#x3C;/script&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;     &amp;#x3C;script src=&quot;footer-component.js&quot; type=&quot;module&quot;&gt;&amp;#x3C;/script&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;/body&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;/html&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;followers-count.js&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; FollowersCount&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; extends&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; HTMLElement&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  constructor&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    super&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = [];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  set&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; socials&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;render&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;  render&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;innerHTML&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;				  	  &amp;#x3C;main&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;				  	      ${&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;social&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;                    return&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; `&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;				                  &amp;#x3C;div class=&quot;media&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;				                  &amp;#x3C;div class=&quot;media-name&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;social&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;media&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#x3C;/div&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;				                  &amp;#x3C;h2 class=&quot;media-followers&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;social&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#x3C;/h2&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;				                  &amp;#x3C;span class=&quot;media-label&quot;&gt;followers&amp;#x3C;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;				                  &amp;#x3C;/div&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;				                `&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;                  })&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;				  	  &amp;#x3C;/main&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;				      `&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;customElements&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;define&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;followers-count&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;FollowersCount&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;app.js&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; import &#39;./followers-count.js&#39;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; async function getData() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   const response = await fetch(&#39;http://localhost:8080/followers&#39;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   const { followers } = await response.json();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   return followers;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;- function render() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-   // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;- }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; function formatNumber(num) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   const formatter = new Intl.NumberFormat(&#39;id-ID&#39;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   return formatter.format(num);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; async function main() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;   const followers = await getData();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   const followersEl = document.querySelector(&#39;followers-count&#39;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   followersEl.socials = followers;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-	render(render);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; main();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Bonus: Rewrite ke Framework lainnya&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Vue&lt;/li&gt;
&lt;li&gt;Svelte&lt;/li&gt;
&lt;li&gt;Astro&lt;/li&gt;
&lt;li&gt;Qwik&lt;/li&gt;
&lt;li&gt;Lit&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Kesimpulan&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Membangun aplikasi web membutuhkan HTML, CSS dan JavaScript&lt;/li&gt;
&lt;li&gt;HTML dapat digunakan untuk menyusun kerangka aplikasi&lt;/li&gt;
&lt;li&gt;CSS digunakan untuk tampilan visual&lt;/li&gt;
&lt;li&gt;JavaScript digunakan untuk interaktivitas&lt;/li&gt;
&lt;li&gt;Pustaka/framework dibutuhkan ketika aplikasi berkembang menjadi semakin kompleks&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Web Scraping dengan Node</title>
    <link href="https://rizafahmi.com/web-scraping/"/>
    <updated>2023-05-25T00:00:00Z</updated>
    <pubDate>2023-05-25T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/web-scraping/</id>
    <summary>Berikut adalah materi tertulis untuk acara workshop di Surabaya yang diselenggarakan Mei 2023. Prasarat Untuk mengikuti materi ini, teman-teman membutuhkan beberapa alat berikut: NodeJS versi 18 atau yang lebih baru…</summary>
    <category term="catatan, javascript, web-scraping, tutorial"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/web-scraping.png"/>
    <content type="html">&lt;p&gt;&lt;small style=&quot;color: rgba(252,252,252,0.5);&quot;&gt;&lt;em&gt;Berikut adalah materi tertulis untuk acara workshop di Surabaya yang diselenggarakan Mei 2023.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;h1&gt;Prasarat&lt;/h1&gt;
&lt;p&gt;Untuk mengikuti materi ini, teman-teman membutuhkan beberapa alat berikut:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nodejs.org/en&quot;&gt;NodeJS versi 18&lt;/a&gt; atau yang lebih baru&lt;/li&gt;
&lt;li&gt;Kode editor seperti &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VS Code&lt;/a&gt;, &lt;a href=&quot;https://www.sublimetext.com/&quot;&gt;Sublime&lt;/a&gt; dll&lt;/li&gt;
&lt;li&gt;Web browser seperti &lt;a href=&quot;https://www.google.com/chrome/index.html&quot;&gt;Chrome&lt;/a&gt;, &lt;a href=&quot;https://www.mozilla.org/en-US/firefox/new/&quot;&gt;Firefox&lt;/a&gt;, dll&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Pengantar&lt;/h1&gt;
&lt;p&gt;Web scraping adalah sebuah teknik untuk ekstraksi data dari sebuah halaman web. Seperti yang kita ketahui bersama halaman web adalah sebuah dokumen yang biasanya digunakan untuk menampikan data dalam bentuk tulisan, gambar dan sebagainya. Data tersebut dapat diambil bagian tertentu dengan teknik web scraping.&lt;/p&gt;
&lt;p&gt;Selain menggunakan API seperti REST API yang disediakan, teknik web scraping seringkali digunakan untuk mendapatkan dan menapilkan data dalam bentuk atau format yang berbeda. Layaknya membuat majalah dinding atau mading.&lt;/p&gt;
&lt;p&gt;Kesempatan kali ini kita akan belajar cara melakukan web scraping dengan JavaScript dan Node sebagai platform dasarnya. Di akhir sesi diharapkan teman-teman yang mengikuti sesi ini sudah dapat melakukan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mempersiapkan proyek node dan instalasi alat bantu&lt;/li&gt;
&lt;li&gt;Melakukan request/pemanggilan/download halaman web yang ingin diambil datanya&lt;/li&gt;
&lt;li&gt;Melakukan ekstraksi (parsing) halaman HTML&lt;/li&gt;
&lt;li&gt;Menampilkan kembali data dalam format berbeda&lt;/li&gt;
&lt;li&gt;Bonus: Simpan ke database&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Bagian 1: Persiapan Proyek&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; webscraping&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; webscraping&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; init&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; -y&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Instalasi alat bantu&lt;/h2&gt;
&lt;p&gt;Cheerio adalah pustaka yang dapat mempermudah kita melakukan ekstraksi dan manipulasi dokumen HTML, XML dan bahasa sejenis.
Salah satu keunggulan Cheerio dibandingkan pustaka lain adalah API yang sederhana penggunaannya terutama untuk membaca, memanipulasi dan ekstraksi data
dari halaman web.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; cheerio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Bagian 2: Web Scraping Dasar&lt;/h1&gt;
&lt;h2&gt;&lt;code&gt;app.js&lt;/code&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; cheerio&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;cheerio&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// Sediakan dokumen HTML&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&#39;&amp;#x3C;h2 class=&quot;title&quot;&gt;Halo Surabaya&amp;#x3C;/h2&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// Muat(load) dokumen HTML ke Cheerio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;cheerio&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;load&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// Uraikan dokumen HTML dengan cheerio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// Ekstraksi data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Coba dijalankan, dan error…&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; app.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;(node:55175) Warning: To load an ES module, set &quot;type&quot;: &quot;module&quot; in the package.json or use the .mjs extension.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;(Use `node --trace-warnings ...` to show where the warning was created)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;/Users/riza/playground/webscrape-tutorial/app.js:1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import * as cheerio from &#39;cheerio&#39;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;^^^^^^&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;SyntaxError: Cannot use import statement outside a module&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	at Object.compileFunction (node:vm:352:18)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	at wrapSafe (node:internal/modules/cjs/loader:1033:15)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	at Module._compile (node:internal/modules/cjs/loader:1069:27)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	at Module._extensions..js (node:internal/modules/cjs/loader:1159:10)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	at Module.load (node:internal/modules/cjs/loader:981:32)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	at Module._load (node:internal/modules/cjs/loader:827:12)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	at node:internal/main/run_main_module:17:47&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Node.js v18.3.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Node secara default masih menggunakan format &lt;code&gt;require&lt;/code&gt;. Agar lebih ‘modern’ mari kita tambahkan opsi dengan tipe modul yang berbeda.&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;	&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;webscrape-tutorial&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;	&quot;version&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;0.0.1&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;	&quot;description&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;	&quot;main&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;index.js&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;	&quot;scripts&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;		&quot;test&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;echo &lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;&#92;&#92;&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#F44747&quot;&gt;Error:&lt;/span&gt;&lt;span style=&quot;color:#F44747&quot;&gt; no&lt;/span&gt;&lt;span style=&quot;color:#F44747&quot;&gt; test&lt;/span&gt;&lt;span style=&quot;color:#F44747&quot;&gt; specified&#92;&#92;&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot; &amp;#x26;&amp;#x26; exit 1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;	&quot;keywords&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;	&quot;author&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Riza Fahmi &amp;#x3C;rizafahmi@gmail.com&gt; (&amp;#x3C;https://rizafahmi.com/&gt;)&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;	&quot;license&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;MIT&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;	&quot;dependencies&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;		&quot;cheerio&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;1.0.0-rc.12&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;	&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;module&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; app.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	[Function: initialize] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		contains: [Function: contains],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		html: [Function: html],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		merge: [Function: merge],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		parseHTML: [Function: parseHTML],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		root: [Function: root],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		text: [Function: text],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		xml: [Function: xml],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		load: [Function: load],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		_root: Document {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			parent: null,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			prev: null,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			next: null,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			startIndex: null,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			endIndex: null,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			children: [ [Element] ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			type: &#39;root&#39;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&#39;x-mode&#39;: &#39;quirks&#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		_options: { xml: false, decodeEntities: true },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		fn: Cheerio {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Memilih elemen&lt;/h2&gt;
&lt;p&gt;Ketika data sudah dimuat, kita bisa memilih(select), menelusuri(traversing), dan memanipulasi dokumen html.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;app.js&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; cheerio&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;cheerio&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// Sediakan dokumen HTML&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&#39;&amp;#x3C;h2 class=&quot;title&quot;&gt;Halo Surabaya&amp;#x3C;/h2&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// Muat(load) dokumen HTML ke Cheerio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;cheerio&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;load&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// Uraikan dokumen HTML dengan cheerio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;h2.title&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// Ekstraksi data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mari gunakan halaman html beneran untuk mempelajari teknik scraping dengan lebih baik&lt;/p&gt;
&lt;h2&gt;Mengunduh halaman web&lt;/h2&gt;
&lt;p&gt;Unduh sebuah halaman web untuk kemudian beberapa bagian akan diambil datanya dengan Cheerio.
Untuk mengunduh halaman web, bisa menggunakan &lt;code&gt;fetch()&lt;/code&gt; yang sudah disediakan oleh NodeJS&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;app.js&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; cheerio&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;cheerio&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; getHtml&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; getHtml&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;https://rizafahmi.com&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;cheerio&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;load&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;h1&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; footer&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;p&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;footer&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;attr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;footer&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Mencari &amp;amp; Menelusuri elemen&lt;/h2&gt;
&lt;p&gt;List artikel&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;app.js&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;import * as cheerio from &#39;cheerio&#39;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;async function getHtml(url) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;	try {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;		const response = await fetch(url)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;		const html = await response.text();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;		return html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;	} catch (error) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;		console.log(error)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;- const html = await getHtml(&#39;https://rizafahmi.com&#39;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ const html = await getHtml(&#39;https://rizafahmi.com/articles&#39;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;const $ = cheerio.load(html);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;- const text = $(&#39;h1&#39;).text();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;- console.log(text);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;- const footer = $(&#39;p&#39;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;- console.log(footer.attr())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;- console.log(footer.text())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ const articles = $(&#39;ul&#39;).find(&#39;li&#39;).find(&#39;a&#39;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ for (let i = 0; i &amp;#x3C; articles.length; i += 1) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   console.log(`${i + 1} - ${articles[i].children[0].data}`)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Misalnya kita ingin mencari daftar artikel di &lt;code&gt;https://rizafahmi.com/2021/09/12/tentang-friction-log/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;/img/Screenshot 2023-05-19 at 20.21.09-300w.webp 300w, /img/Screenshot 2023-05-19 at 20.21.09-600w.webp 600w, /img/Screenshot 2023-05-19 at 20.21.09-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screenshot%202023-05-19%20at%2020.21.09-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;620&quot; srcset=&quot;/img/Screenshot 2023-05-19 at 20.21.09-300w.png 300w, /img/Screenshot 2023-05-19 at 20.21.09-600w.png 600w, /img/Screenshot 2023-05-19 at 20.21.09-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;app.js&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; cheerio&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;cheerio&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; getHtml&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; getHtml&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;  &quot;https://rizafahmi.com/2021/09/12/tentang-friction-log/&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;cheerio&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;load&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; footer&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;footer&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;a&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;footer&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// 10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;footer&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; += &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;footer&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;children&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Mencari keatas&lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;/img/Screenshot 2023-05-19 at 20.28.08-300w.webp 300w, /img/Screenshot 2023-05-19 at 20.28.08-600w.webp 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screenshot%202023-05-19%20at%2020.28.08-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;600&quot; height=&quot;284&quot; srcset=&quot;/img/Screenshot 2023-05-19 at 20.28.08-300w.png 300w, /img/Screenshot 2023-05-19 at 20.28.08-600w.png 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;app.js&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; cheerio&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;cheerio&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; getHtml&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; getHtml&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;  &quot;https://rizafahmi.com/2021/09/12/tentang-friction-log/&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;cheerio&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;load&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; header5&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;h5&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;header5&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;prop&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;tagName&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// Footer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;header5&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;prop&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;tagName&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// Body&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Mencari berikutnya/sebelumnya&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;app.js&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; cheerio&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;cheerio&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; getHtml&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; getHtml&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;https://rizafahmi.com/articles&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;cheerio&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;load&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; first_article&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;li:first&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;first_article&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; second_article&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;first_article&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;second_article&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; third_article&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;second_article&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;third_article&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;third_article&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;prev&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Bagian 3: Client-side Scraping&lt;/h1&gt;
&lt;p&gt;Mari scrape instagram, dan ambil data jumlah follower&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;app.js&lt;/code&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; cheerio&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;cheerio&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; getHtml&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; getHtml&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;https://instagram.com/rizafahmi&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;cheerio&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;load&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;.css-901oao&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Karena dokumen di-render di sisi klien (web browser)
Kita butuh pustaka lain: puppeteer&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; puppeteer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;app.js&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; puppeteer&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;puppeteer&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; getHtml&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; browser&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; puppeteer&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;launch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;({ &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;headless:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;new&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; browser&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;newPage&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;goto&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;waitForNetworkIdle&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    // await page.screenshot({ path: &#39;screenshot.png&#39; })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; data&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;evaluate&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; () {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&#39;a[role=&quot;link&quot;]&gt;span&gt;span&#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)[&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        .&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;innerText&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;      return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; browser&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;close&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; data&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; followers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; getHtml&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;https://twitter.com/rizafahmi22&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;`Followers: &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;followers&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Bagian 4: Simpan ke database&lt;/h1&gt;
&lt;h2&gt;Backend/webservice&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; express&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; -D&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; nodemon&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;server.js&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; express&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;express&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; app&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;express&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;app&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;/ping&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;req&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;res&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  res&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;({ &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;status:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;OK&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;app&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;/followers&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;req&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;res&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  res&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    status:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;OK&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    followers:&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; [{ &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;media:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;twitter&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;count:&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 5629&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;app&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;listen&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;3000&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; () {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;Server is listening on port 3000&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;collapsed:: true&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;name&quot;: &quot;webscrape-tutorial&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;version&quot;: &quot;0.0.1&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;description&quot;: &quot;&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;main&quot;: &quot;index.js&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;scripts&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    &quot;test&quot;: &quot;echo &#92;&quot;Error: no test specified&#92;&quot; &amp;#x26;&amp;#x26; exit 1&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     &quot;dev&quot;: &quot;nodemon server.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;keywords&quot;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;author&quot;: &quot;Riza Fahmi &amp;#x3C;rizafahmi@gmail.com&gt; (https://rizafahmi.com/)&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;license&quot;: &quot;MIT&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;dependencies&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    &quot;cheerio&quot;: &quot;1.0.0-rc.12&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     &quot;express&quot;: &quot;5.0.0-beta.1&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    &quot;puppeteer&quot;: &quot;20.2.1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  &quot;type&quot;: &quot;module&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   &quot;devDependencies&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     &quot;nodemon&quot;: &quot;2.0.22&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;server.js&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;import express from &#39;express&#39;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ import { getHtml } from &#39;./app.js&#39;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ import { getDB, initDB } from &#39;./db.js&#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;const app = express();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;app.get(&#39;/ping&#39;, function(req, res) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  res.json({ status: &#39;OK&#39; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;app.get(&#39;/followers&#39;, function(req, res) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  res.json({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    status: &#39;OK&#39;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    followers: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      {media: &quot;twitter&quot;, count: 5629}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ app.get(&#39;/sync&#39;, async function(req, res) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   initDB();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   try {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     const followers = await getHtml(&#39;https://twitter.com/rizafahmi22&#39;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     const db = getDB();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     const sql = `INSERT INTO followers (followers) VALUES (${parseInt(followers.replace(/,/g, &#39;&#39;))});`;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     db.run(sql);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     res.json({ status: &quot;ok&quot; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   } catch (error) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     res.json({ status: error });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+   }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+ })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;app.listen(3000, function() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  console.log(&#39;Server is listening on port 3000&#39;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; sqlite3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;db.js&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; sqlite3&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;sqlite3&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; getDB&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; sqlite3&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;Database&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;./followers.db&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; initDB&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; db&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;getDB&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; sql&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;`CREATE TABLE IF NOT EXISTS followers (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;			        id INTEGER PRIMARY KEY AUTOINCREMENT,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;			        followers INTEGER,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;			        last_updated DATETIME DEFAULT CURRENT_TIMESTAMP);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;			        `&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; db&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;sql&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Kesimpulan&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Web scraping adalah sebuah teknik untuk ekstraksi data dari sebuah halaman web&lt;/li&gt;
&lt;li&gt;Ada dua metode web scraping yang bisa dilakukan: server-side dan client-side&lt;/li&gt;
&lt;li&gt;Melakukan web scraping dengan JavaScript/Node dapat dilakukan dengan pustaka seperti Cheerio&lt;/li&gt;
&lt;li&gt;Juga bisa menggunakan pustaka seperti Puppeeter apabila web menggunakan metode client-side rendering atau single-page app&lt;/li&gt;
&lt;li&gt;Menggunakan metode kedua dengan Puppeeter lebih berat secara performa karena mengemulasi pengguna dengan web browser&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Tentang Friction Log</title>
    <link href="https://rizafahmi.com/2021/09/12/tentang-friction-log/"/>
    <updated>2021-09-12T00:00:00Z</updated>
    <pubDate>2021-09-12T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2021/09/12/tentang-friction-log/</id>
    <summary>Friction log adalah sebuah cara untuk mengevaluasi sebuah produk, atau meluncurkan fitur baru. Tujuannya untuk merekam pengalaman dalam menggunakan fitur atau produk tersebut. Friction log biasanya berdasarkan skenario…</summary>
    <category term="catatan, produktivitas"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/friction-log.png"/>
    <content type="html">&lt;p&gt;Friction log adalah sebuah cara untuk mengevaluasi sebuah produk, atau
meluncurkan fitur baru. Tujuannya untuk merekam pengalaman dalam
menggunakan fitur atau produk tersebut.&lt;/p&gt;
&lt;p&gt;Friction log biasanya berdasarkan skenario nyata. Misalnya bagaimana proses
deployment aplikasi Django di Heroku.&lt;/p&gt;
&lt;p&gt;Biasanya setiap pengalaman yang didapat dikategorikan menjadi tiga jenis:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pengalaman yang menyenangkan dilambangkan dengan warna hijau 🟢&lt;/li&gt;
&lt;li&gt;Pengalaman yang kurang menyenangkan, membingungkan, atau bikin frustrasi
dilambangkan dengan warna &lt;em&gt;orange&lt;/em&gt; 🟠&lt;/li&gt;
&lt;li&gt;Pengalaman yang buruk dilambangkan dengan warna merah 🔴&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Kegunaa Friction Log&lt;/h2&gt;
&lt;p&gt;Friction log dapat juga digunakan untuk proses &lt;em&gt;onboarding&lt;/em&gt; anggota tim baru.
Friction log sebaiknya dilakukan secara manual oleh manusia dan ditujukan untuk
mendapatkan masukan secara mendetil bukan (hanya) untuk mencari bugs 🐛.
Friction log juga dapat dibuat sembari membuat tutorial, demo, dan lain sebagainya.&lt;/p&gt;
&lt;h2&gt;Kapan Dibutuhkan Friction Log?&lt;/h2&gt;
&lt;p&gt;Friction log biasanya dibuat saat sebelum meluncurkan produk baru atau fitur baru.
Juga bisa digunakan untuk memperkenalkan produk kepada anggota tim baru. Biasanya
friction log juga dapat dibuat ketika ada komplain atau masukan dari pengguna yang dikirimkan
melalui email, media sosial, atau media lainnya.&lt;/p&gt;
&lt;h2&gt;Setelah menulis Friction Log&lt;/h2&gt;
&lt;p&gt;Setelah friction log dibuat, kita bisa mendiskusikan hasilnya dengan tim produk, bagikan hasilnya
dengan menulis blog dan sebagainya.&lt;/p&gt;
&lt;h2&gt;Contoh Friction Log&lt;/h2&gt;
&lt;p&gt;Saya sempat mencontohkan cara membuat friciton log dari awal di beberapa sesi &lt;em&gt;livestreaming&lt;/em&gt;. Dan ternyata tanpa disadari saya juga sudah melakukan friction log beberapa kali walaupun belum didokumentasikan. Untungnya saya melakukannya di sesi &lt;em&gt;livestreaming&lt;/em&gt; sehingga dapat diputar ulang dan dibuat dokumentasi tertulisnya.&lt;/p&gt;
&lt;h3&gt;Sesi Belajar Friction Log&lt;/h3&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/Otl_KX0Ye_g&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/18I8S_SXWu8&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;h3&gt;Sesi Qore dan Next.js&lt;/h3&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/XkIv2A2To_A&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/9p9aDaDcQMU&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;h3&gt;Menjajal Fitur Baru KaryaKarsa&lt;/h3&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/aELLHUqy5CA?start=2496&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;h2&gt;Referensi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/friction-logs/&quot;&gt;Friction Logs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=765wLWVcyS0&quot;&gt;Friction logging 101 - Emma Iwao - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zuZnOFUCpxs&quot;&gt;Friction Logs for Product Teams: Live Example - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frictionlog.com/&quot;&gt;frictionlog.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Panduan Menulis Artikel Pemrograman</title>
    <link href="https://rizafahmi.com/panduan-menulis/"/>
    <updated>2021-01-28T00:00:00Z</updated>
    <pubDate>2021-01-28T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/panduan-menulis/</id>
    <summary>Panduan singkat dalam menulis artikel pemrograman</summary>
    <category term="catatan, menulis, produktivitas, panduan"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/panduan-menulis.png"/>
    <content type="html">&lt;p&gt;Berikut adalah panduan singkat dalam menulis artikel pemrograman. Jika teman-teman memiliki pengalaman atau pengetahuan tertentu mengenai pemrograman dan ingin membagikannya untuk teman-teman lainnya, teman-teman dapat merumuskan pengalaman tersebut kedalam sebuah tulisan. Dengan demikian pengetahuan ataupun pengalaman tersebut akan lebih berguna.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Artikel ini disadur dari talk yang dibawakan oleh &lt;a href=&quot;https://rachelnabors.com/&quot; target=&quot;_blank&quot;&gt;Rachel Nabors&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Pemilihan Topik&lt;/h2&gt;
&lt;p&gt;Pertanyaan paling sering muncul biasanya ketika ingin menulis, mengisi acara, talk, meetup, konferensi dan lain sebagainya adalah bagaimana memilih topik yang tepat.&lt;/p&gt;
&lt;p&gt;Disaat kita baru belajar sebuah topik dan seolah kita sangat bersemangat untuk membangikan apa yang baru kita pelajari kepada banyak orang biasanya dapat menjadi sumber inspirasi untuk menulis sebuah artikel.&lt;/p&gt;
&lt;p&gt;Inspirasi berikutnya yang tidak kalah menarik adalah ketika kita melakukan kesalahan dalam pekerjaan dan juga dapat dibungkus menjadi sebuah topik. Dilengkapi dengan solusi bagaimana menyelesaikan masalah tersebut tentunya.&lt;/p&gt;
&lt;p&gt;Atau kamu baru saja berhasil menyelesaikan masalah tertentu di kantor. Pengalaman menyenangkan tersebut juga dapat menjadi topik pilihan.&lt;/p&gt;
&lt;p&gt;Atau mungkin ketika googling ataupun membaca sebuah tutorial, kita seringkali berharap ada yang membahas sebuah topik dengan pendekatan yang berbeda, atau dengan studi kasus yang berbeda.&lt;/p&gt;
&lt;p&gt;Nah ini kesempatan buat kita untuk membuatnya menjadi bentuk artikel atau tulisan. Buatlah tutorial yang diharapkan ada namun belum ada yang membuatnya.&lt;/p&gt;
&lt;p&gt;Mungkin saja artikel ini sudah tersedia dalam bahasa selain bahasa Indonesia, kita bisa membuat versi bahasa Indonesia-nya. Namun jangan hanya melakukan translasi. Modifikasi juga agar sesuai dengan kebutuhan dan dengan bahasa kita sendiri.&lt;/p&gt;
&lt;h2&gt;Target Pembaca&lt;/h2&gt;
&lt;p&gt;Sebaiknya tentukan target pembaca ketika menulis sebuah artikel. Sehingga kita bisa berasumsi bahwa pembaca sudah mengenal terminologi atau konsep yang akan kita bahas. Sehingga sekiranya kita memperkenalkan konsep yang masih asing, kita bisa membahasnya lebih mendalam untuk target pembaca tersebut.&lt;/p&gt;
&lt;p&gt;Dan tentunya pemilihan bahasa yang nyaman untuk digunakan atau dibaca oleh calon pembaca kita sesuai dengan targetnya. Jika artikel ditujukan untuk pembaca dari Indonesia, cobalah untuk menyajikan dengan Bahasa Indonesia. Jika artikel atau tutorial ditujukan untuk semua kalangan, menggunakan bahasa Inggris adalah ide yang baik.&lt;/p&gt;
&lt;h2&gt;Gunakan Struktur Yang Umum Digunakan&lt;/h2&gt;
&lt;p&gt;Artikel yang baik memiliki struktur yang jelas. Disadari atau tidak, ada tiga bagian utama: pembuka, inti, dan penutup atau kesimpulan.&lt;/p&gt;
&lt;h3&gt;Bagian Pembuka&lt;/h3&gt;
&lt;p&gt;Bagian pembuka sangat penting karena akan menentukan artikel kita menarik untuk dibaca atau tidak. Bagian pembuka yang baik biasanya dapat menjawab pertanyaan tentang: apa, kenapa, siapa, kapan, dimana dan bagaimana. Hal ini lazim disebut dengan istilah 5W &amp;amp; 1H.&lt;/p&gt;
&lt;p&gt;Contohnya teman-teman bisa menulis tentang siapa target pembaca, apa saja yang akan dipelajari, kenapa topik ini penting, kapan topik ini akan berguna, dimana akan digunakan dan bagaimana implementasi diluar contoh tutorial ini.&lt;/p&gt;
&lt;h3&gt;Bagian Utama&lt;/h3&gt;
&lt;p&gt;Inti dari artikel juga butuh struktur yang kokoh. Strukturnya terdiri dari tiga bagian:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pengenalan konsep baru,&lt;/li&gt;
&lt;li&gt;Contoh kode,&lt;/li&gt;
&lt;li&gt;Penjelasan rinci dari beberapa baris kode yang dicontohkan&lt;/li&gt;
&lt;li&gt;Ulangi hingga artikel selesai&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/inti-300w.webp 300w, https://rizafahmi.com/img/inti-444w.webp 444w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/inti-300w.png&quot; alt=&quot;Struktur Artikel&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;444&quot; height=&quot;756&quot; srcset=&quot;https://rizafahmi.com/img/inti-300w.png 300w, https://rizafahmi.com/img/inti-444w.png 444w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3&gt;Bagian Penutup&lt;/h3&gt;
&lt;p&gt;Bagian yang tidak kalah penting adalah bagian penutup atau kesimpulan. Di bagian ini kita akan menjabarkan apa saja yang sudah kita bahas sebagai pengingat. Bisa juga ditambahkan artikel terkait jika pembaca ingin menggali lebih dalam tentang materi pembahasan.&lt;/p&gt;
&lt;h3&gt;Contoh Interaktif&lt;/h3&gt;
&lt;p&gt;Apabila memungkinkan gunakan contoh kode yang interaktif. Teman-teman bisa menggunakan servis seperti codesandbox, codepen, expo snack dan lain sebagainya sehingga pembaca dapat menjalankan contoh kode dan dapat melihat hasilnya.&lt;/p&gt;
&lt;h3&gt;Gunakan Ilustrasi&lt;/h3&gt;
&lt;p&gt;Menurut Dr. Lynell Burmark, kata-kata diproses oleh short-term memory yang hanya dapat bertahan kurang-lebih dua menit saya. Sedangkan ilustrasi atau gambar langsung masuk ke long-term memory dan dapat lebih lama untuk diingat oleh otak kita.&lt;/p&gt;
&lt;p&gt;Jadi gunakanlah ilustrasi sesering mungkin. Tidak perlu terlalu artistik dan harus membayar ilustrator untuk artikel kita, bisa gunakan servis seperti excalidraw, draw.io dan lain sebagainya untuk menggambarkan konsep yang ingin kita bahas.&lt;/p&gt;
&lt;h2&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Demikian panduan untuk menulis artikel pemrograman. Kita sudah membahas tentang bagaimana memilih topik, menentukan target pembaca, menyusun struktur, menggunakan contoh yang interaktif, dan juga ilustrasi agar artikel atau tutorial lebih menarik.&lt;/p&gt;
&lt;p&gt;Berikut checklist untuk membuat artikel:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pilih topik&lt;/li&gt;
&lt;li&gt;Tentukan target pembaca&lt;/li&gt;
&lt;li&gt;Struktur Umum digunakan
&lt;ul&gt;
&lt;li&gt;Bagian pembuka&lt;/li&gt;
&lt;li&gt;Bagian utama&lt;/li&gt;
&lt;li&gt;Bagian penutup&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Gunakan contoh yang interaktif&lt;/li&gt;
&lt;li&gt;Gunakan ilustrasi&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Rekursi: Fungsi Yang Memanggil Dirinya Sendiri</title>
    <link href="https://rizafahmi.com/2020/03/26/rekursi-atau-recursion/"/>
    <updated>2020-03-26T00:00:00Z</updated>
    <pubDate>2020-03-26T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2020/03/26/rekursi-atau-recursion/</id>
    <summary>Di artikel ini kita akan mempelajari salah satu dari konsep fundamental dari ilmu komputer, rekursi atau recursion . Rekursi sederhananya adalah fungsi yang memanggil fungsi tersebut atau dirinya sendiri. Namun tidak…</summary>
    <category term="catatan, computer-science, algoritma, javascript"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/martin-adams-lxujDxNigL4-unsplash.jpg"/>
    <content type="html">&lt;p&gt;Di artikel ini kita akan mempelajari salah satu dari konsep fundamental dari ilmu komputer, rekursi atau &lt;em&gt;recursion&lt;/em&gt;. Rekursi sederhananya adalah fungsi yang memanggil fungsi tersebut atau dirinya sendiri. Namun tidak berhenti disitu saja, ada beberapa aspek yang harus dibahas sebelum kita menggunakan rekursi di kode kita.&lt;/p&gt;
&lt;p&gt;Menurut saya pribadi, rekursi ini penting dan tidak penting. Penting karena kita bisa menciptakan solusi yang elegan untuk menerapkan D.R.Y atau (&lt;em&gt;don&#39;t repeat yourself&lt;/em&gt;). Selain itu, rekursi adalah salah satu pengetahuan fundamental yang sangat diharapkan dikuasai oleh kita sebagai developer. Dan yang tidak kalah penting adalah banyak sekali algoritma diluar sana yang menggunakan rekursi sehingga dengan memahaminya, secara tidak langsung kita bisa mengerti algoritma yang menggunakan rekursi.&lt;/p&gt;
&lt;p&gt;Namun sebenarnya pun tanpa rekursi pun kita bisa saja menggunakan perulangan untuk menciptakan solusi yang sama, namun dengan cara yang kurang elegan. Kembali menurut saya, setidaknya mengerti cara kerja rekursi adalah hal yang sangat krusial meskipun kita masih jarang menggunakannya.&lt;/p&gt;
&lt;p&gt;Mari kita buat sebuah fungsi penghitung mundur. Tentu fungsi ini dapat dengan mudah kita buat dengan menggunakan perulangan, nanum untuk keperluan pembelajaran kita akan membuat versi rekursinya.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; countdown&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;  countdown&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; - &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;countdown&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jika dijalankan, maka akan menghasilkan keluaran sebagai berikut.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-9&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-11&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-13&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-14&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-15&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-16&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-17&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;....&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;RangeError: Maximum call stack size exceeded&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fungsi rekursi diatas akan menghasilkan &lt;em&gt;infinite loop&lt;/em&gt; hingga sumber daya komputer kita habis dan berhenti. Mengapa hal ini bisa terjadi? Karena kita berasumsi bahwa proses menghitung mundur akan berhenti jika mencapai angka 0 kan? Salah besar, karena contoh diatas akan terus berjalan menuju angka negatif.&lt;/p&gt;
&lt;p&gt;Ada dua aspek yang harus dimiliki oleh fungsi rekursi. Sebuah fungsi rekursi harus &lt;em&gt;mengetahui kapan harus berhenti&lt;/em&gt; dan &lt;em&gt;kapan harus memanggil dirinya kembali&lt;/em&gt;. Fungsi &lt;code&gt;countdown()&lt;/code&gt; diatas sudah memanggil dirinya sendiri berulang kali hingga tak terhingga. Namun masih kurang aspek kapan harus berhenti. Sekarang kita akan menambahkan kondisi kapan fungsi &lt;code&gt;countdown()&lt;/code&gt; ini harus berhenti.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; countdown&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;= &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;    countdown&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; - &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;countdown&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dan jika kita eksekusi maka hasilnya akan sesuai keinginan kita.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ node countdown.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Contoh Penggunaan Rekursi&lt;/h2&gt;
&lt;h3&gt;Fungsi Faktorial&lt;/h3&gt;
&lt;p&gt;Sekarang kita akan melihat salah satu contoh populer penggunaan rekursi, yaitu
faktorial. Faktorial adalah sebuah fungsi permutasi dari bilangan bulat positif
yang menggunakan notasi &lt;code&gt;n!&lt;/code&gt;. Faktorial akan mengalikan bilangan dengan bilangan
berikutnya hingga terakhir dikalikan angka 1. Faktorial mengikuti rumus berkikut.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;n! = n * (n-1) * (n-2) * (n-3) * ... * 3 * 2 * 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Contoh, jika kita ingin mendapatkan faktorial dari 5.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;5! = 5 * 4 * 3 * 2 * 1 = 120&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Mari kita buat sebuah algoritma faktorial dengan perulangan terlebih dahulu.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; computeFactorial&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;num&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; results&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C;= &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;num&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;++) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    results&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;results&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; * &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; results&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;computeFactorial&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hasilnya tentu saja 120 apabila dijalankan. Dan sekarang mari kita membuat sebuah algoritma faktorial dengan menggunakan rekursi.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; calculateFactorial&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;num&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;num&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; === &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; num&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; * &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;calculateFactorial&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;num&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; - &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;calculateFactorial&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mari kita review penggunaan rekuris dari fungsi faktorial diatas. Fungsi rekursi
yang kita buat memiliki fungsi yang memanggil dirinya sendiri di baris ke-5
tepatnya dan juga fungsi juga mengetahui kapan harus berhenti, tepatnya ada di
baris ke-3.&lt;/p&gt;
&lt;p&gt;Sayangnya JavaScript sebagai bahasa belum memiliki fitur semacam pencocokan pola
atau &lt;em&gt;pattern matching&lt;/em&gt; layaknya bahasa pemrograman fungsional. Jika punya, kode
diatas dapat kita buat menjadi lebih elegan 😎 seperti contoh dibawah ini dengan
menggunakan bahasa pemrograman &lt;a href=&quot;https://elixir-lang.org/&quot;&gt;Elixir&lt;/a&gt; yang merupakan bahasa pemrograman fungsional.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;defmodule&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Factorial&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; calculate&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;    1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; calculate&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(num) when num &gt; &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    num * &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;calculate&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(num - &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;IO&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;inspect&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Factorial&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;calculate&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Fungsi Memutarbalikkan Array&lt;/h3&gt;
&lt;p&gt;Sebagai latihan, kita akan membuat sebuah fungsi yang menerima sebuah array dan
membalikkan isinya dari akhir ke awal dengan rekursi tentu saja. Misalkan saya
memiliki sebuah array &lt;code&gt;[1, 2, 3, 4, 5, 6]&lt;/code&gt; dan akan menghasilkan &lt;code&gt;[6, 5, 4, 3, 2, 1]&lt;/code&gt;. Untuk memudahkan proses pembuatan algoritma, saya akan menulis testing
terlebih dahulu.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// reverse.test.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; reverse&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;./reverse.js&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;reverse array items, recursively&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, () &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;  expect&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;reverse&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;])).&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;toEqual&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dan sekarang kita akan menulis kode implementasinya seperti berikut.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// reverse.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; reverse&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;arr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;newArr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = []) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  newArr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;arr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;arr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; - &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;newArr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; - &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;newArr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; === &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;arr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; newArr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; reverse&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;arr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;newArr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;module&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;exports&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;reverse&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kode implementasi diatas bukanlah cara satu-satunya untuk menyelesaikan masalah
memutarbalikkan isi dari array. Ada banyak cara lainnya. Ini adalah cara yang
&lt;em&gt;kepikiran&lt;/em&gt; aja saat artikel ini ditulis 😃.&lt;/p&gt;
&lt;h2&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Rekursi adalah sebuah cara elegan untuk menyelesaikan beberapa masalah dalam
pemrograman. Rekursi juga merupakan salah satu kemampuan fundamental yang
diharapkan sudah dikuasai oleh teman-teman yang ingin terjun ke dunia
pemrograman. Maka tak heran jika beberapa pertanyaan terkait rekursi akan muncul
ketika kita melakukan &lt;em&gt;coding interview&lt;/em&gt; di perusahaan teknologi.&lt;/p&gt;
&lt;p&gt;Beberapa konsep struktur data pun seringkali menggunakan rekursi. Hal ini akan
kita bahas lain waktu.&lt;/p&gt;
&lt;p&gt;Selamat belajar!&lt;/p&gt;
&lt;h2&gt;Referensi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.manning.com/books/grokking-algorithms&quot;&gt;Buku &#39;Grokking Algorithms: An illustrated guide for programmers and other curious people&#39;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/courses/data-structures-algorithms/&quot;&gt;Video &#39;FrontendMasters Data Structures and Algorithms in JavaScript, Bianca Gandolfo&#39;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Notasi O Besar atau Big-O Notation</title>
    <link href="https://rizafahmi.com/2020/03/21/notasi-o-besar-big-o-notation/"/>
    <updated>2020-03-21T00:00:00Z</updated>
    <pubDate>2020-03-21T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2020/03/21/notasi-o-besar-big-o-notation/</id>
    <summary>Ketika kita memikirkan apakah barisan kode yang kita ciptakan sudah cukup &quot;cepat&quot; atau efisien dalam memecahkan masalah yang ingin kita pecahkan, maka kita butuh sebuah metodologi untuk menghitungnya. Salah…</summary>
    <category term="catatan, computer-science, algoritma, javascript"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/valentin-lacoste-jNSJE8dMro0-unsplash.jpg"/>
    <content type="html">&lt;p&gt;Ketika kita memikirkan apakah barisan kode yang kita ciptakan sudah cukup &amp;quot;cepat&amp;quot; atau efisien dalam memecahkan masalah yang ingin kita pecahkan, maka kita butuh sebuah metodologi untuk menghitungnya. Salah satu alat bantu yang bisa kita gunakan adalah notasi O besar atau &lt;em&gt;Big-O Notation&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ini juga berarti kita ingin menghitung kompleksitas dari sebuah kode. Ada dua dimensi dalam menghitung kompleksitas kode. Pertama adalah kompleksitas ruang atau &lt;em&gt;space complexity&lt;/em&gt; yang berkaitan dengan berapa banyak ruang yang digunakan seperti memori ataupun harddisk komputer. Kedua adalah kompleksitas waktu atau &lt;em&gt;time complexity&lt;/em&gt; yang berkaitan berapa lama baris kode dijalankan.&lt;/p&gt;
&lt;p&gt;Kenapa dibutuhkan sebuah metode untuk menghitung efisiensi kode? Karena kita tidak bisa hanya mengatakan bahwa kumpulan kode ini dapat dijalankan selama lima detik. Padahal sangat banyak faktor penentu lainnya seperti jumlah datanya, koneksi, latensi, jumlah memori, kecepatan prosesor dan masih banyak yang lainnya.&lt;/p&gt;
&lt;p&gt;Karena itu kita butuh alat ukur untuk menghitung efisiensi kode secara relatif seperti notasi O besar ini.&lt;/p&gt;
&lt;h1&gt;Sekilas Tentang Notasi O Besar&lt;/h1&gt;
&lt;p&gt;Notasi O besar atau yang lazim disebut dengan Big-O Notation adalah sebuah cara atau metode untuk melakukan analisa terhadap sebuah algoritma pemrograman terhadap waktu eksekusi. Tentang seberapa efisien dan kompleksitas barisan kode dalam dimensi waktu.&lt;/p&gt;
&lt;p&gt;Di dalam sebuah program komputer pada umumnya, kita sudah lazim dengan istilah masukan-proses-keluaran.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/input-300w.webp 300w, https://rizafahmi.com/img/input-600w.webp 600w, https://rizafahmi.com/img/input-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/input-300w.png&quot; alt=&quot;input, proses, output&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;112&quot; srcset=&quot;https://rizafahmi.com/img/input-300w.png 300w, https://rizafahmi.com/img/input-600w.png 600w, https://rizafahmi.com/img/input-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Notasi O besar merupakan skenario terburuk dari sebuah algoritma, dan biasanya terdapat notasi &lt;em&gt;n&lt;/em&gt; yang merepresentasikan jumlah masukan. Berikut adalah diagram notasi O besar dengan masukan yang dimulai dari 0 hingga tak terhingga.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/grafikcopy-300w.webp 300w, https://rizafahmi.com/img/grafikcopy-600w.webp 600w, https://rizafahmi.com/img/grafikcopy-870w.webp 870w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/grafikcopy-300w.png&quot; alt=&quot;grafik&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;870&quot; height=&quot;510&quot; srcset=&quot;https://rizafahmi.com/img/grafikcopy-300w.png 300w, https://rizafahmi.com/img/grafikcopy-600w.png 600w, https://rizafahmi.com/img/grafikcopy-870w.png 870w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Dari diagram diatas dapat kita lihat beberapa notasi yang kerap muncul, yaitu: O&lt;sub&gt;(1)&lt;/sub&gt;, O&lt;sub&gt;(log n)&lt;/sub&gt;, O&lt;sub&gt;(n)&lt;/sub&gt;, O&lt;sub&gt;(n&lt;sup&gt;2&lt;/sup&gt;)&lt;/sub&gt; atau O&lt;sub&gt;(n&lt;sup&gt;n&lt;/sup&gt;)&lt;/sub&gt;. Untuk membahasnya, mari kita berandai-andai membangun sebuah aplikasi travel. Dan kita diminta untuk membuat fitur baru yang menampilkan daftar kisaran harga dari hotel-hotel yang berada di area tertentu.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/kayak-300w.webp 300w, https://rizafahmi.com/img/kayak-600w.webp 600w, https://rizafahmi.com/img/kayak-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/kayak-300w.png&quot; alt=&quot;kayak&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1076&quot; srcset=&quot;https://rizafahmi.com/img/kayak-300w.png 300w, https://rizafahmi.com/img/kayak-600w.png 600w, https://rizafahmi.com/img/kayak-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Untuk membuat fitur tersebut, sederhananya kita mencari harga terendah (min) dan harga tertinggi (max) dari daftar hotel. Tentunya semakin banyak datanya, akan semakin lama pula proses untuk mencari harga terendah dan tertinggi.&lt;/p&gt;
&lt;p&gt;Dan berikut versi sederhana dari representasi data yang akan kita gunakan. Kita akan menggunakan JavaScript sebagai contoh. Dapat juga diaplikasikan ke bahasa pemrograman lain.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; hotels&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;{ &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;price:&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 180&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;brand:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;Hotel Tugu Lombok&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;{ &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;price:&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 78&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;brand:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;Sheraton Senggigi Beach Resort&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;{ &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;price:&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 317&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;brand:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;The Oberio&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Pengulangan di Dalam Pengulangan: O&lt;sub&gt;(N&lt;sup&gt;2&lt;/sup&gt;)&lt;/sub&gt;&lt;/h2&gt;
&lt;p&gt;Sekarang, bagaimana caranya mencari harga terendah dan tertinggi? Cara yang paling naif adalah dengan membandingkan harga satu-per-satu. Berikut potongan kode sebagai ilustrasi.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;hotels&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;++) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; j&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;j&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;hotels&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;j&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;++) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    // kode untuk membandingkan satu harga dengan harga lainnya...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mari kita simulasikan ketika jumlah data semakin banyak.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;n&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;5&lt;/th&gt;
&lt;th&gt;10&lt;/th&gt;
&lt;th&gt;100&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jumlah Operasi&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;10000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Lihat tabel diatas, antara 3 dan 5 cukup dekat perbedaannya hanya dua. Namun jumlah operasi yang dijalankan sangat signifikan bedanya. Semakin banyak datanya semakin signifikan jumlah operasi yang dijalankan.&lt;/p&gt;
&lt;p&gt;Dengan kata lain kita membutuhkan n&lt;sup&gt;2&lt;/sup&gt; dan untuk mencari harga terendah (min) dan harga tertinggi (max). Itulah sebabnya kita menyebutnya dengan notasi &lt;strong&gt;O&lt;sub&gt;(n&lt;sup&gt;2&lt;/sup&gt;)&lt;/sub&gt;&lt;/strong&gt;. Algoritma seperti ini sangatlah lambat dan tidak optimal.&lt;/p&gt;
&lt;h2&gt;Pengulangan Dari Sebuah Set: O&lt;sub&gt;(N)&lt;/sub&gt;&lt;/h2&gt;
&lt;p&gt;Jika solusi pertama tidak optimal, adakah solusi lain? Tentu. Misalnya kita bisa mencari apakah harga adalah yang terendah atau tertinggi dalam satu kali pengulangan saja seperti ilustrasi kode berikut.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;hotels&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;++) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;  // cari harga paling kecil...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;  // cari harga paling besar...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ketika kita membutuhkan proses &amp;quot;pengulangan untuk setiap item&amp;quot;, merupakan notasi &lt;strong&gt;O&lt;sub&gt;(N)&lt;/sub&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Hanya Satu Operasi: O&lt;sub&gt;(1)&lt;/sub&gt;&lt;/h2&gt;
&lt;p&gt;Jika dengan asumsi bahwa data &lt;code&gt;hotels&lt;/code&gt; sudah diurutkan berdasarkan harga terendah ke harga tertinggi, maka pencarian harga terendah dan tertinggi menjadi semakin efisien.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; hotels&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;price:&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 78&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;brand:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;Sheraton Senggigi Beach Resort&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;price:&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 180&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;brand:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;Hotel Tugu Lombok&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;price:&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 317&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;brand:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;The Oberio&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Untuk mendapatkan harga terendah, kita tinggal memanggil &lt;code&gt;hotels[0].price&lt;/code&gt;. Sementara untuk harga tertinggi kita bisa menggunakan &lt;code&gt;hotels[hotels.length-1].price&lt;/code&gt;. Selain lebih mudah, eksekusi baris kode juga menjadi lebih cepat dan efisien.&lt;/p&gt;
&lt;p&gt;Ketika kode menjalankan sebuah operasi, misalkan: &lt;em&gt;baris kode untuk mencari item barang teratas&lt;/em&gt; atau &lt;em&gt;mendapatkan nilai sebuah array dengan indeks ke-5&lt;/em&gt;. Operasi seperti ini kita bisa sebut sebagai notasi O&lt;sub&gt;(1)&lt;/sub&gt;.&lt;/p&gt;
&lt;p&gt;Tidak masalah sebanyak apapun isi dari sebuah array atau sebanyak apapun jumlah baris di basis data, untuk mengambil nilai array dengan mengakses indeks maka algoritma berjalan secara konstan atau &lt;em&gt;constant time&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Kita sudah melihat beberapa contoh algoritma untuk menampilkan kisaran harga dari yang terendah hingga tertinggi dan hasilnya sebagai berikut.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Notasi O&lt;/th&gt;
&lt;th&gt;Istilah Lain&lt;/th&gt;
&lt;th&gt;Jumlah Operasi&lt;/th&gt;
&lt;th&gt;Algoritma&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;O&lt;sub&gt;(n&lt;sup&gt;2&lt;/sup&gt;)&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;Quadratic&lt;/td&gt;
&lt;td&gt;n&lt;sup&gt;2&lt;/sup&gt;&lt;/td&gt;
&lt;td&gt;Komparasi seluruh harga. Pengulangan dalam pengulangan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;O&lt;sub&gt;(n)&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;Linear&lt;/td&gt;
&lt;td&gt;2n&lt;/td&gt;
&lt;td&gt;Mencari harga terendah dan tertinggi. 1 kali pengulangan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;O&lt;sub&gt;(1)&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;Constant&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Asumsi sudah diurut berdasarkan harga, tinggal mencari elemen pertama dan elemen terakhir&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Dan secara umum berikut urutan dari notasi O besar diurutkan dari yang tercepat hingga yang terpelan.&lt;/p&gt;
&lt;p&gt;&amp;lt;--- Super Cepat --------------------------------------- Super Lambat ---------&amp;gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;em&gt;Nama&lt;/em&gt;&lt;/th&gt;
&lt;th&gt;Constant&lt;/th&gt;
&lt;th&gt;Logaritmic&lt;/th&gt;
&lt;th&gt;Linear&lt;/th&gt;
&lt;th&gt;Quadratic&lt;/th&gt;
&lt;th&gt;Exponential&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Notasi&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;O&lt;sub&gt;(1)&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;O&lt;sub&gt;(log n)&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;O&lt;sub&gt;(n)&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;O&lt;sub&gt;(n&lt;sup&gt;2&lt;/sup&gt;)&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;O&lt;sub&gt;(n&lt;sup&gt;n&lt;/sup&gt;)&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/grafikcopy-300w.webp 300w, https://rizafahmi.com/img/grafikcopy-600w.webp 600w, https://rizafahmi.com/img/grafikcopy-870w.webp 870w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/grafikcopy-300w.png&quot; alt=&quot;grafik&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;870&quot; height=&quot;510&quot; srcset=&quot;https://rizafahmi.com/img/grafikcopy-300w.png 300w, https://rizafahmi.com/img/grafikcopy-600w.png 600w, https://rizafahmi.com/img/grafikcopy-870w.png 870w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;aside class=&quot;subscription-box&quot;&gt;
  &lt;h3&gt;Kelas Online Struktur Data dengan JavaScript - BuildWithAngga.com&lt;/h3&gt;
  &lt;div&gt;
    &lt;img style=&quot;width:25%&quot; src=&quot;https://www.buildwithangga.com/storage/assets/thumbnails/thumbnail%20alur%20belajar%20menjadi%20front%20end%20developer%20buildwith%20angga.png&quot; /&gt;
    &lt;p&gt;Kelas online Struktur Data dengan JavaScript ini akan membahas berbagai macam struktur data. Mulai dari struktur data fundamental seperti array dan object literal, kemudian struktur data stack dan queue, hingga struktur data linked list.&lt;/p&gt;
    &lt;div class=&quot;my-2&quot;&gt;
    &lt;a class=&quot;color-black button&quot; href=&quot;https://buildwithangga.com/kelas/struktur-data-dengan-javascript&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ikuti Kelas&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/aside&gt;
&lt;h2&gt;Beberapa Contoh Notasi O Besar&lt;/h2&gt;
&lt;p&gt;Mari kita melihat contoh notasi O besar dari fungsi, ekspresi dan operasi JavaScript yang sederhana.&lt;/p&gt;
&lt;h3&gt;1. Array.push()&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;push()&lt;/code&gt; merupakan sebuah metode untuk menambahkan item baru kedalam sebuah array. Item yang ditambahkan akan berada diakhir array tersebut. Contoh penggunaan dapat dilihat sebagai berikut.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; animals&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = [&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;ants&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;goats&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;cows&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;animals&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;fish&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;animals&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// [&#39;ants&#39;, &#39;goats&#39;, &#39;cows&#39;, &#39;fish&#39;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Apakah notasi yang tepat untuk baris kode &lt;code&gt;animals.push(&#39;fish&#39;);&lt;/code&gt;? Karena metode &lt;code&gt;push()&lt;/code&gt; tidak peduli dengan seberapa banyak atau sedikit jumlah item yang ada, artinya operasi yang berjalan tetap sama, maka metode &lt;code&gt;push()&lt;/code&gt; ini dapat diwakilkan dengan notasi &lt;strong&gt;O&lt;sub&gt;(1)&lt;/sub&gt;&lt;/strong&gt; atau &lt;strong&gt;konstan&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;2. Array.pop()&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;pop()&lt;/code&gt; merupakan sebuah metode yang mengambil item terakhir dari array sehingga jumlah item yang ada di array akan berkurang satu. Berikut contoh penggunaannya.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; plants&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = [&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;broccoli&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;cauliflower&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;cabbage&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;tomato&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;plants&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;pop&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;plants&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// [&quot;broccoli&quot;, &quot;cauliflower&quot;, &quot;cabbage&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Apakah notasi yang tepat untuk baris kode &lt;code&gt;plants.pop();&lt;/code&gt;? Mirip seperti metode &lt;code&gt;push()&lt;/code&gt; diatas, metode &lt;code&gt;pop()&lt;/code&gt; juga tidak mempermasalahkan jumlah item yang ada, artinya operasi yang berjalan tetap sama, maka metode &lt;code&gt;pop()&lt;/code&gt; ini juga dapat diwakilkan dengan notasi &lt;strong&gt;O&lt;sub&gt;(1)&lt;/sub&gt;&lt;/strong&gt; atau &lt;strong&gt;konstan&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;3. Array.unshift()&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;unshift()&lt;/code&gt; adalah sebuah metode untuk menambahkan satu atau beberapa item ke bagian awal dari sebuah array. Contoh penggunaannya sebagai berikut.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; array1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = [&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;array1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;unshift&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;array1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// [4, 5, 1, 2, 3]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sekilas operasi &lt;code&gt;unshift()&lt;/code&gt; ini terlihat seperti operasi yang konstan seperti &lt;code&gt;push()&lt;/code&gt; dan &lt;code&gt;pop()&lt;/code&gt; namun jika kita melakukan implementasi ulang metode ini, maka akan terlihat notasi yang sebenarnya. Berikut kira-kira implementasi dari &lt;code&gt;unshift()&lt;/code&gt;, implementasi naif tentunya sekedar gambaran.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; unshift&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;arr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;newItem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; newArr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = [];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  newArr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;] = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;newItem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;arr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; + &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;++) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    newArr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;] = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;arr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; - &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; newArr&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hal yang menambah kompleksitas adalah ketika kita harus mengubah indeks dari array karena kita akan menempatkan item baru di indeks ke-0. Secara otomatis indeks akan bergeser sebanyak satu langkah. Dan karena itu kita menggunakan pengulangan &lt;code&gt;for&lt;/code&gt; hingga menjadikan operasi &lt;code&gt;unshift()&lt;/code&gt; dapat diwakilkan oleh notasi &lt;strong&gt;linear&lt;/strong&gt; atau &lt;strong&gt;O&lt;sub&gt;(n)&lt;/sub&gt;&lt;/strong&gt;. Kita harus menyadari apa yang dilakukan oleh sebuah fungsi, operasi ataupun pustaka sehingga kita dapat memprediksi kira-kira seberapa tingkat kompleksitasnya.&lt;/p&gt;
&lt;h2&gt;Menghitung Total Kompleksitas Kode&lt;/h2&gt;
&lt;p&gt;Setelah sebelumnya kita sudah menghitung kompleksitas satu baris kode, sekarang kita akan menghitung total keseluruhan untuk beberapa baris kode. Kita akan mulai dari contoh sederhana terlebih dahulu.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C; &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;++) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;  // O(n)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; j&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;j&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C; &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;j&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;++) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    // O(n)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// O(1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;j&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// O(1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kompleksitas potongan kode diatas dapat dihitung dengan mengalikan notasi-notasi setiap baris. Karena terdapat pengulangan bersarang, maka operasi yang digunakan adalah perkalian. Artinya hasil dari pengulangan bersarang tersebut adalah: &lt;strong&gt;O(n) * O(n) = O&lt;sub&gt;(n&lt;sup&gt;2&lt;/sup&gt;)&lt;/sub&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Jika perintah yang berada di level yang sama seperti:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// O(1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;j&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// O(1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Maka operasi yang akan kita lakukan adalah menjumlahkan. Sehingga untuk kedua perintah diatas hasilnya adalah &lt;strong&gt;O&lt;sub&gt;(1)&lt;/sub&gt; + O&lt;sub&gt;(1)&lt;/sub&gt; = O&lt;sub&gt;(2)&lt;/sub&gt;&lt;/strong&gt;. Jika digabungkan hasilnya menjadi &lt;strong&gt;O&lt;sub&gt;(n&lt;sup&gt;2&lt;/sup&gt;)&lt;/sub&gt; O&lt;sub&gt;(2)&lt;/sub&gt;&lt;/strong&gt;. Namun biasanya untuk jenis kode diatas cukup dilambangkan dengan &lt;strong&gt;O&lt;sub&gt;(n&lt;sup&gt;2&lt;/sup&gt;)&lt;/sub&gt; _ O&lt;sub&gt;(2)&lt;/sub&gt;&lt;/strong&gt; karena &lt;strong&gt;O&lt;sub&gt;(2)&lt;/sub&gt;&lt;/strong&gt; tidak signifikan perbedaannya.&lt;/p&gt;
&lt;p&gt;Mari kita lihat contoh kode berikutnya.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C; &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;++) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;  // O(n)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; j&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;j&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;#x3C; &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;j&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;++) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;  // O(n)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  console&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;j&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Potongan kode deiatas dapat dilambangkan sebagai &lt;strong&gt;O&lt;sub&gt;(n)&lt;/sub&gt;&lt;/strong&gt; ditambah dengan &lt;strong&gt;O&lt;sub&gt;(n)&lt;/sub&gt;&lt;/strong&gt; sehingga menjadi &lt;strong&gt;O&lt;sub&gt;(2n)&lt;/sub&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h1&gt;Kesimpulan&lt;/h1&gt;
&lt;p&gt;Sebagai kesimpulan, notasi O besar atau &lt;em&gt;Big-O Notation&lt;/em&gt; merupakan metode untuk menghitung kompleksitas dari potongan kode yang kita buat. Sehingga dapat menumbuhkan kesadaran kita untuk mencari alternatif yang lebih baik sebelum data semakin besar dan berdampak kepada performa aplikasi yang kita buat.&lt;/p&gt;
&lt;p&gt;Notasi O besar inipun tidak hanya semata berlaku di bagian kode yang kita tulis,
namun di &lt;em&gt;database&lt;/em&gt; pun berlaku. Jadi proses pengambilan data di database dengan
sintaksis SQL yang dapat dianggap sebagai proses perulangan akan sangat tidak
efektif jika di bagian algoritma kode kita kembali menggunakan perulangan. Maka
proses tersebut akan menjadi &lt;strong&gt;O&lt;sub&gt;(n&lt;sup&gt;2&lt;/sup&gt;)&lt;/sub&gt;&lt;/strong&gt; karena
akan terdapat perulangan didalam perulangan.&lt;/p&gt;
&lt;p&gt;Begitu juga halnya jika kita mengambil data dengan tabel yang sudah diindeks.
Secara otomatis notasinya akan berubah dari &lt;strong&gt;O&lt;sub&gt;(n)&lt;/sub&gt;&lt;/strong&gt;
menjadi &lt;strong&gt;O&lt;sub&gt;(log n)&lt;/sub&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/tanpa_index-300w.webp 300w, https://rizafahmi.com/img/tanpa_index-600w.webp 600w, https://rizafahmi.com/img/tanpa_index-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/tanpa_index-300w.png&quot; alt=&quot;tanpa index&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;316&quot; srcset=&quot;https://rizafahmi.com/img/tanpa_index-300w.png 300w, https://rizafahmi.com/img/tanpa_index-600w.png 600w, https://rizafahmi.com/img/tanpa_index-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Tanpa menggunakan indeks database melakukan yang disebut dengan &amp;quot;Sequential
Scan&amp;quot;. Beberapa yang lain menyebutnya dengan istilah &amp;quot;Full Table Scan&amp;quot; yang
kurang-lebih melakukan perulangan setiap barisnya dan membandingkan dengan
argumen query yang kita tentukan.&lt;/p&gt;
&lt;p&gt;Dengan kata lain operasi &lt;em&gt;sequential&lt;/em&gt; seperti contoh diatas dapat kita beri
notasi &lt;strong&gt;O&lt;sub&gt;(n)&lt;/sub&gt;&lt;/strong&gt;. Seiring bertambahnya jumlah data,
efisiensi akan semakin menurun.&lt;/p&gt;
&lt;p&gt;Hal termudah untuk mengangkat performa untuk kasus ini adalah dengan menambahkan
indeks di tabel terkait dan kita dapat melihat perbedaan yang cukup signifikan
terutama ketika data sudah semakin banyak.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/dengan_index-300w.webp 300w, https://rizafahmi.com/img/dengan_index-600w.webp 600w, https://rizafahmi.com/img/dengan_index-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/dengan_index-300w.png&quot; alt=&quot;dengan index&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;398&quot; srcset=&quot;https://rizafahmi.com/img/dengan_index-300w.png 300w, https://rizafahmi.com/img/dengan_index-600w.png 600w, https://rizafahmi.com/img/dengan_index-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Sehingga operasi diatas berubah notasinya menjadi &lt;strong&gt;O&lt;sub&gt;(log
n)&lt;/sub&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Hal yang menarik lainnya, &lt;a href=&quot;https://redis.io/&quot;&gt;Redis&lt;/a&gt; sebuah &lt;em&gt;in-memory
database&lt;/em&gt; menyertakan notasi kompleksitas waktu di setiap perintah yang ada di
&lt;a href=&quot;https://redis.io/commands&quot;&gt;dokumentasinya&lt;/a&gt;. Contohnya dapat dilihat seperti
perintah &lt;a href=&quot;https://redis.io/commands/append&quot;&gt;append&lt;/a&gt;,
&lt;a href=&quot;https://redis.io/commands/del&quot;&gt;del&lt;/a&gt;, &lt;a href=&quot;https://redis.io/commands/lpush&quot;&gt;lpush&lt;/a&gt;,
dan masih banyak lagi yang lainnya.&lt;/p&gt;
&lt;p&gt;Sebagai penutup, berikut daftar kompleksitas kode dari operasi-operasi yang umum kita jumpai.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kompleksitas&lt;/th&gt;
&lt;th&gt;Operasi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;O&lt;sub&gt;(1)&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;Menjalankan sebuah perintah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;O&lt;sub&gt;(1)&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;Mendapatkan sebuah item dari array, objek atau variabel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;O&lt;sub&gt;(log n)&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;Pengulangan yang berkurang setengahnya setiap iterasi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;O&lt;sub&gt;(n&lt;sup&gt;2&lt;/sup&gt;)&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;Pengulangan dalam pengulangan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;O&lt;sub&gt;(n&lt;sup&gt;3&lt;/sup&gt;)&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;Pengulangan dalam pengulangan dalam pengulangan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;aside class=&quot;subscription-box&quot;&gt;
  &lt;h3&gt;Kelas Online Struktur Data dengan JavaScript - BuildWithAngga.com&lt;/h3&gt;
  &lt;div&gt;
    &lt;img style=&quot;width:25%&quot; src=&quot;https://www.buildwithangga.com/storage/assets/thumbnails/thumbnail%20alur%20belajar%20menjadi%20front%20end%20developer%20buildwith%20angga.png&quot; /&gt;
    &lt;p&gt;Kelas online Struktur Data dengan JavaScript ini akan membahas berbagai macam struktur data. Mulai dari struktur data fundamental seperti array dan object literal, kemudian struktur data stack dan queue, hingga struktur data linked list.&lt;/p&gt;
    &lt;div class=&quot;my-2&quot;&gt;
    &lt;a class=&quot;color-black button&quot; href=&quot;https://buildwithangga.com/kelas/struktur-data-dengan-javascript&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ikuti Kelas&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/aside&gt;
&lt;h1&gt;Referensi&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://btholt.github.io/four-semesters-of-cs/&quot;&gt;Materi &#39;Four Semesters of Computer Science in Six Hours&#39;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com/JavaScript-Data-Structures-Algorithms-Understanding/dp/1484239873&quot;&gt;Buku &#39;JavaScript Data Structures and Algorithms, Sammie Bae&#39;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/courses/data-structures-algorithms/&quot;&gt;Video &#39;FrontendMasters Data Structures and Algorithms in JavaScript, Bianca Gandolfo&#39;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Ekosistem JavaScript Di Indonesia</title>
    <link href="https://rizafahmi.com/2020/02/03/ekosistemjs/"/>
    <updated>2020-02-03T00:00:00Z</updated>
    <pubDate>2020-02-03T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2020/02/03/ekosistemjs/</id>
    <summary>This article also available in Engilish . Artikel ini akan membahas tentang bagaimana perkembangan ekosistem JavaScript di Indonesia. Namun sebelum kita masuk ke pembahasan utama, mari kita bahas dulu tentang definisi…</summary>
    <category term="catatan, javascript, komunitas, rangkuman, konferensi, frontend, framework"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/JSDAy.jpg"/>
    <content type="html">&lt;p&gt;This article also available in &lt;a href=&quot;https://rizafahmi.com/ekosistemjs/en/&quot;&gt; Engilish &lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Artikel ini akan membahas tentang bagaimana perkembangan ekosistem JavaScript di
Indonesia. Namun sebelum kita masuk ke pembahasan utama, mari kita bahas dulu
tentang definisi ekosistem di konteks artikel ini. Topik ini merupakan materi
yang saya bawakan ketika mengisi keynote di &lt;a href=&quot;https://jsday.id/&quot;&gt; JSDay 2019 &lt;/a&gt;.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-theme=&quot;dark&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Riza is delivering keynote at &lt;a href=&quot;https://twitter.com/hashtag/jsdayid?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#jsdayid&lt;/a&gt;. First JavaScript conference in Indonesia. &lt;a href=&quot;https://twitter.com/rizafahmi22?ref_src=twsrc%5Etfw&quot;&gt;@rizafahmi22&lt;/a&gt; &lt;a href=&quot;https://t.co/yxXKm1cNxM&quot;&gt;pic.twitter.com/yxXKm1cNxM&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jecelyn Yeen (@JecelynYeen) &lt;a href=&quot;https://twitter.com/JecelynYeen/status/1177778326758277120?ref_src=twsrc%5Etfw&quot;&gt;September 28, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;h2&gt;Tentang Ekosistem JavaScript&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;“An ecosystem is a community of living organisms and their interactions with their abiotic (non-living) environment.” — Ecology of ecosystems&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yang dimaksud ekosistem disini diantaranya adalah komunitas, grup dan diskusi sekitar sebuah tools, alat bantu, framework dan JavaScript secara umum. Dalam konteks ini kita akan membahas empat elemen berikut:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sumber belajar seperti artikel, buku, video tutorial dan lain sebagainya&lt;/li&gt;
&lt;li&gt;Kelengkapan alat bantu seperti pustaka, boilerplate, contoh aplikasi dan lain-lain&lt;/li&gt;
&lt;li&gt;Dukungan komunitas di sekitar alat bantu dan juga lingkungan sekitar&lt;/li&gt;
&lt;li&gt;Pembahasan akan fokus di frontend karena JavaScript di sisi backend cukup &lt;em&gt;straightforward&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Sudut Pandang Pembahasan&lt;/h2&gt;
&lt;p&gt;Artikel ini akan membagi pembahasan kepada tiga sudut pandang. Sudut pandang pertama ditujukan untuk yang baru mulai belajar, kita sebut saja pemula. Kita akan mencoba menjawab beberapa pertanyaan yang sering muncul di benak pemula ketika ingin belajar JavaScript. Kemudian kita juga akan membahas JavaScript dari sudut pandang teman-teman yang sudah pernah membuat aplikasi dan ingin belajar hal baru terutama teknologi web. Kita sebut saja sebagai profesional. Sudut pandang terakhir diperuntukkan kepada para pengambil keputusan seperti Vice President, Chief Technology Officer, Team Lead dan lain sebagainya. Kita menyebutnya sebagai sudut pandang master.&lt;/p&gt;
&lt;h2&gt;Sudut Pandang Pemula&lt;/h2&gt;
&lt;p&gt;Sudut pandang ini diperuntukkan kepada teman-teman fresh graduate, developer profesional dengan pengalaman setahun atau kurang, dan yang &#39;terjebak&#39;. Terjebak sudah terlebih dahulu masuk ke sebuah perusahaan yang ternyata sudah menggunakan pustaka atau framework tertentu. Kita akan menjawab pertanyaan-pertanyaan yang seringkali muncul di benak seorang pemula.&lt;/p&gt;
&lt;h3&gt;Mulai Dari Mana?&lt;/h3&gt;
&lt;p&gt;Biasanya pertanyaan yang pertama kali muncul kalau mau mulai belajar, mulainya dari mana? Dan berikut adalah beberapa pertanyaan terkait memulai belajar pustaka atau &lt;em&gt;framework&lt;/em&gt; JavaScript. Namun sebelum itu pastikan teman-teman sudah menguasai JavaScript itu sendiri beserta HTML dan sedikit CSS. Jika merasa belum terlalu menguasai, teman-teman bisa mulai belajar dari hal-hal tersebut.&lt;/p&gt;
&lt;p&gt;Berikutnya kita akan membahas beberapa pertanyaan berikut:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sebaiknya belajar framework apa ya?&lt;/li&gt;
&lt;li&gt;Lingkungan sekitar banyak menggunakan yang mana? Hal ini cukup penting terutama buat yang baru belajar&lt;/li&gt;
&lt;li&gt;Kemudian kita juga akan melihat seberapa banyak artikel, buku yang tersedia untuk mendukung proses belajar&lt;/li&gt;
&lt;li&gt;Dan tentunya kita juga akan mengeksplorasi seberapa banyak kursus video online yang ada&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Belajar Framework Apa?&lt;/h3&gt;
&lt;p&gt;Framework JavaScript banyak sekali pilihannya. Terkadang untuk yang mulai belajar, pemilihan framework menjadi sesuatu yang cukup sulit. Ada yang bilang framework ini bagus. Opini lain mengatakan framework lain lebih cepat dan lain sebagainya. Untuk itu saya memilihkan enam opsi yang dapat dipilih. Keenam framework ini memiliki karakteristik yang cukup berbeda yang menurut saya mewakili framework lain yang tersedia.&lt;/p&gt;
&lt;p&gt;Untuk framework dengan fitur lengkap diwakili oleh Angular dan Ember, yang cukup lengkap ada React dan Vue, pustaka untuk memanipulasi DOM dan cukup terkenal di masanya, jQuery. Dan terakhir ada framework yang melakukan kompilasi ke JavaScript vanilla yang mungkin akan menjadi tren kedepan yaitu Svelte.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-theme=&quot;dark&quot;&gt;&lt;p lang=&quot;in&quot; dir=&quot;ltr&quot;&gt;&lt;img src=&quot;https://pbs.twimg.com/media/EFhRDE5U8AAcPCj?format=jpg&amp;name=large&quot; alt=&quot;salfok&quot; /&gt; Salfok sama slide presentasi dari om &lt;a href=&quot;https://twitter.com/rizafahmi22?ref_src=twsrc%5Etfw&quot;&gt;@rizafahmi22&lt;/a&gt; 😹 &lt;a href=&quot;https://twitter.com/hashtag/JSDayID?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#JSDayID&lt;/a&gt; &lt;a href=&quot;https://t.co/W5XnrDEits&quot;&gt;pic.twitter.com/W5XnrDEits&lt;/a&gt;&lt;/p&gt;&amp;mdash; FarahLuthfiOktarina (@FarahOktarina) &lt;a href=&quot;https://twitter.com/FarahOktarina/status/1177780426800128001?ref_src=twsrc%5Etfw&quot;&gt;September 28, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;Dari keenam framework dan pustaka diatas, mari kita lihat bagaimana ekosistemnya dengan melihat komunitas disekitar framework dan pustaka tersebut. Peran komunitas ini penting untuk mendukung kita belajar terutama untuk mempercepat proses belajar. Berikut adalah gambaran komunitas JavaScript secara umum di berbagai kota yang datanya berhasil saya dapatkan. Masih banyak kota-kota lain yang memiliki komunitas JavaScript sebenarnya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_08.54.48-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_08.54.48-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_08.54.48-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_08.54.48-300w.png&quot; alt=&quot;Screen_Shot_2020-01-23_at_08.54.48.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_08.54.48-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_08.54.48-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_08.54.48-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Seperti yang dapat dilihat, komunitas MedanJS memiliki total 334 anggota meskipun saat ini sedang vakum. BaliJS ada 474 anggota, SurabayaJS ada 510, JogjaJS 545. Sedangkan jumlah anggota terbanyak masih berada di kota Bandung dengan 2.500 anggota dan Jakarta yang nyaris mencapai 4.000 anggota.&lt;/p&gt;
&lt;p&gt;Dan berikut adalah komunitas untuk beberapa framework yang berhasil saya dapatkan datanya. Saya berhasil mendapatkan tiga komunitas framework, yaitu: Vue, Angular dan juga React.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.00.05-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.00.05-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.00.05-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.00.05-300w.png&quot; alt=&quot;Screen_Shot_2020-01-23_at_09.00.05.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.00.05-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.00.05-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.00.05-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Ternyata untuk komunitas per framework masih didominasi oleh React dan Angular. Sedangkan komunitas Vue agak jauh perbedaannya dibandingkan React dan Angular.&lt;/p&gt;
&lt;p&gt;Data berikutnya yang akan kita lihat adalah grup facebook dari tiap-tiap framework atau pustaka yang berhasil saya dapatkan. Semua grup ini spesifik yang berbahasa Indonesia saja. Saya juga menambahkan informasi jumlah anggota, umur dari grup dan juga percakapan yang terjadi per tahunnya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.11.42-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.11.42-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.11.42-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.11.42-300w.png&quot; alt=&quot;Screen_Shot_2020-01-23_at_09.11.42.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.11.42-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.11.42-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.11.42-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Hasilnya cukup menarik. Anggota yang paling banyak tentu saja grup jQuery, karena memang termasuk pustaka yang paling lama senior. jQuery sendiri sudah menemani developer JavaScript sejak tahun 2006 sehingga tidak heran jumlah anggotanya yang paling banyak.&lt;/p&gt;
&lt;p&gt;Sedangkan grup yang paling aktif bukanlah jQuery ternyata. Grup React, Angular dan Vue tercatat memiliki anggota yang paling aktif.&lt;/p&gt;
&lt;p&gt;Sedangkan untuk grup Svelte dan Ember memiliki anggota yang paling sedikit dibandingkan framework atau pustaka lainnya. Svelte tentu saja karena merupakan framework yang tergolong baru. Sedangkan Ember anggotanya masih sedikit, meskipun umur grupnya sudah 4 tahun.&lt;/p&gt;
&lt;p&gt;Satu data lagi terkait komunitas, yaitu grup di platform Telegram yang lumayan menarik terutama untuk yang mulai serius belajar pemrograman.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.14.04-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.14.04-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.14.04-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.14.04-300w.png&quot; alt=&quot;Screen_Shot_2020-01-23_at_09.14.04.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.14.04-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.14.04-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.14.04-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Di Telegram, saya juga baru berhasil mendapatkan tiga komunitas yaitu Angular, Vue dan React. Data ini didapat dengan bantuan &lt;a href=&quot;https://carik.id/&quot;&gt; carikbot &lt;/a&gt;. Saya berhasil mendapatkan informasi jumlah anggota dan percakapan yang terjadi sepanjang agustus sampai pertengahan september 2019.&lt;/p&gt;
&lt;p&gt;Yang paling aktif dan paling banyak anggotanya, React disusul Vue dan disusul Angular.&lt;/p&gt;
&lt;h3&gt;Literatur atau Buku Tersedia&lt;/h3&gt;
&lt;p&gt;Dan dibagian ini kita akan membahas tentang ketersediaan literatur, dalam hal ini adalah buku. Pertanyaannya apakah buku masih relevan sebagai sumber belajar? Terutama buku berbahasa Indonesia. Untuk saya pribadi sih jawabannya masih relevan. Apalagi buat teman-teman mahasiswa yang ingin belajar dan menggunakan framework atau pustaka tertentu di tugas akhirnya. Kan keren kalau ada buku yang bisa dijadikan referensi belajar dan bisa dikutip juga untuk skripsi atau tugas akhir.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.18.05-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.18.05-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.18.05-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.18.05-300w.png&quot; alt=&quot;Screen_Shot_2020-01-23_at_09.18.05.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.18.05-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.18.05-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-23_at_09.18.05-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Mungkin sebagian besar dari kita sudah bisa menebak hasilnya. Cukup menyedihkan karena jumlah buku yang tersedia masih sangat sedikit. Ini khusus buku berbahasa Indonesia. Untuk mendapatkan data ini saya melakukan pencarian dari gramedia online dan juga google. Untuk buku fisik yang tersedia, jQuery merupakan pustaka yang paling banyak sumber bacaannya. Sedangkan framework lainnya terhitung masih sangat sedikit.&lt;/p&gt;
&lt;p&gt;Tidak puas dengan buku fisik, saya juga melakukan pencarian buku elektronik berbahasa Indonesia yang sebenarnya cukup menarik. Untuk format buku elektronik, Angular ada dua buku, namun masih membahas tentang Angular versi 1 yang cukup jauh berbeda dengan Angular versi terbaru saat ini. Buku elektronik tentang Vue dan React juga hanya tersedia sedikit.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-theme=&quot;dark&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;&lt;img src=&quot;https://pbs.twimg.com/media/EFhQqW6VAAECI30?format=jpg&amp;name=medium&quot; alt=&quot;peluang&quot; /&gt; &lt;a href=&quot;https://twitter.com/rizafahmi22?ref_src=twsrc%5Etfw&quot;&gt;@rizafahmi22&lt;/a&gt; kick off &lt;a href=&quot;https://twitter.com/hashtag/JSDayID?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#JSDayID&lt;/a&gt; with a talk about JavaScript ecosystem. There&amp;#39;s still very few technical book in Bahasa Indonesia. But that means we still have lots of opportunity 😉 &lt;a href=&quot;https://t.co/JCU23Surj2&quot;&gt;pic.twitter.com/JCU23Surj2&lt;/a&gt;&lt;/p&gt;&amp;mdash; Kiki ✈️ (@kelimuttu) &lt;a href=&quot;https://twitter.com/kelimuttu/status/1177780009450127361?ref_src=twsrc%5Etfw&quot;&gt;September 28, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;h3&gt;Kursus Video Online&lt;/h3&gt;
&lt;p&gt;Berikutnya kita akan bahas tentang kursus video online. Disini saya batasi khusus untuk kursus video online yang cukup lengkap dan ada learning path. Bukan sembarang video tutorial berbahasa Indonesia yang ada di Youtube.&lt;/p&gt;
&lt;p&gt;Ada beberapa platform kursus video online yang membahas tentang pemrograman, lebih spesifiknya tentang JavaScript dan berbagai frameworknya. Ada malescast, dumbways, idrails, sekolah koding dan juga kode.id.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_17.46.27-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_17.46.27-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_17.46.27-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_17.46.27-300w.png&quot; alt=&quot;Screen_Shot_2020-01-25_at_17.46.27.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_17.46.27-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_17.46.27-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_17.46.27-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Seperti yang sama-sama bisa kita lihat, yang paling produktif menghasilkan kursus video online terkait JavaScript adalah sekolah koding karena memang sudah berdiri sejak lama, 2016. Dumbways lebih banyak menghasilkan materi seputar framework React. Sedangkan malescast lebih fokus menghasilkan materi tentang vue. Sedangkan idrails memiliki materi seputar vue dan react.&lt;/p&gt;
&lt;p&gt;Selanjutnya kita akan melihat jumlah viewer dikelompokkan berdasarkan pustaka dan framework.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_17.51.13-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_17.51.13-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_17.51.13-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_17.51.13-300w.png&quot; alt=&quot;Screen_Shot_2020-01-25_at_17.51.13.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_17.51.13-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_17.51.13-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_17.51.13-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Ternyata jQuery merajai jumlah view dari kursus video online dengan angka nyaris seratus ribu. Kontribusi terbesar dari sekolah koding yang memang sudah memproduksi video course dari 2016. Diikuti vue dengan angka sekitar tuju puluh ribuan dan disusul react dengan lima puluh ribuan.&lt;/p&gt;
&lt;h2&gt;Sudut Pandang Profesional&lt;/h2&gt;
&lt;p&gt;Kita masuk ke sudut pandang yang kedua. Kita akan melihat dari sudut pandang seseorang yang memiliki pengalaman lebih banyak dibandingkan sudut pandang pertama. Yang masuk kategori ini adalah teman-teman yang setidaknya sudah pernah merasakan bagaimana mengembangkan sebuah aplikasi, aplikasi web misalnya. Di sudut pandang ini, kita tidak lagi bertanya bagaimana cara memulai, tapi lebih ke bagaimana cara belajar yang efektif. Kita akan menjawab beberapa pertanyaan terkait bagaimana cara belajar sesuatu. Cara belajar merupakan topik yang subjektif. Masing-masing individu memiliki cara belajar yang berbeda-beda. Jadi kita akan mencoba menjawab beberapa pertanyaan umum tentang cara belajar, seperti berikut:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Buat yang suka dengan cara belajar melihat contoh, kita akan melihat berapa banyak contoh aplikasi yang tersedia untuk masing-masing pustaka atau framework.&lt;/li&gt;
&lt;li&gt;Kemudian kita akan melihat ketersediaan tutorial berbahasa Indonesia untuk masing-masing kandidat pustaka dan juga framework.&lt;/li&gt;
&lt;li&gt;Kemudian kita akan melihat beberapa alat bantu dan boilerplate yang bisa kita gunakan untuk membuat project baru.&lt;/li&gt;
&lt;li&gt;Terakhir kita akan melihat bagaimana cara penggunaan masing-masing pustaka dan framework. Kita akan membuat aplikasi hello world satu per satu.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Contoh Aplikasi&lt;/h3&gt;
&lt;p&gt;Sekarang kita akan melihat berapa banyak contoh aplikasi yang bisa kita lihat sebagai referensi dan panduan. Saya mencoba melakukan pencarian di berbagai servis seperti glitch.com, codepen namun tidak ada informasi pasti jumlah contoh aplikasi untuk keenam pustaka dan framework tadi.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-theme=&quot;dark&quot;&gt;&lt;p lang=&quot;in&quot; dir=&quot;ltr&quot;&gt;&lt;img src=&quot;https://pbs.twimg.com/media/EFiVLvpVAAAtHC7?format=jpg&amp;name=medium&quot; /&gt; sebuah slide yang sangat ciamik dari mas &lt;a href=&quot;https://twitter.com/rizafahmi22?ref_src=twsrc%5Etfw&quot;&gt;@rizafahmi22&lt;/a&gt; ntah berapa lama buatnya 😅😅 &lt;a href=&quot;https://t.co/kAbOiUmMdI&quot;&gt;pic.twitter.com/kAbOiUmMdI&lt;/a&gt;&lt;/p&gt;&amp;mdash; Adib Firman (@dibfirman) &lt;a href=&quot;https://twitter.com/dibfirman/status/1177855341788160000?ref_src=twsrc%5Etfw&quot;&gt;September 28, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;Satu-satunya yang bisa mendapatkan total jumlah aplikasi per framework atau pustaka adalah dari codesandbox. Dan disini sangat jauh perbedaan antar framework. React mendominasi dengan nyaris ada 2 juta contoh aplikasi. Sangat jau dibandingkan vue yang hanya dua ratus ribuan.&lt;/p&gt;
&lt;p&gt;Data dari codesandbox ini agak bias, karena codesandbox awalnya hanya mendukung React cukup lama. Baru kemudian setelah beberapa lama mendukung framework lain. Itulah sebabnya React sangat mendominasi.&lt;/p&gt;
&lt;h3&gt;Tutorial Berbahasa Indonesia&lt;/h3&gt;
&lt;p&gt;Untuk mendapatkan jumlah tutorial berbahasa Indonesia, saya melakukan pencarian via google dengan kata kunci “nama framework tutorial indonesia” dan buka tautannya satu per satu sampai halaman ketiga dan memastikan bahwa tutorial tersebut benar-benar valid dikategorikan sebagai tutorial dan berbahasa Indonesia. Dan berikut hasilnya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_18.20.08-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_18.20.08-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_18.20.08-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_18.20.08-300w.png&quot; alt=&quot;Screen_Shot_2020-01-25_at_18.20.08.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_18.20.08-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_18.20.08-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_18.20.08-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Disini Angular, jQuery, React dan Vue jumlahnya nyaris sama berkisar antara 10 hingga 15. Sedangkan Svelte dan Ember agak susah dicari tutorial berbahasa Indonesia. Sebenarnya secara umum jumlah artikel berbahasa Indonesia ini jumlahnya masih terbilang sedikit. Sama halnya dengan literatur dalam format buku. Ini sebenarnya peluang buat teman-teman yang ingin membuat konten spesifik berbahasa Indonesia.&lt;/p&gt;
&lt;h3&gt;Alat Bantu dan &lt;em&gt;Boilerplate&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Berikutnya kita akan membahas tentang alat bantu dan &lt;em&gt;boilerplate&lt;/em&gt; yang tersedia. Framework, apalagi pustaka umumnya dikelilingi oleh berbagai alat bantu dan juga &lt;em&gt;boilerplate&lt;/em&gt; yang tujuannya adalah memudahkan kita untuk menggunakan framework atau pustaka tersebut.&lt;/p&gt;
&lt;p&gt;Kita akan melihat beberapa alatbantu seperti ketersediaan di Content Delivery Network atau CDN. Adanya CDN memudahkan jika teman-teman tidak ingin menggunakan command line interface atau CLI. Jadi semudah metambahkan link script via CDN.&lt;/p&gt;
&lt;p&gt;Tentu kita juga akan melihat dukungan berupa CLI, apakah sudah tersedia fitur seperti routing, state, alat bantu pengembangan atau devtools dan juga CLI untuk generator yang dapat meningkatkan produktifitas kita sebagai developer.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_19.04.43-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_19.04.43-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_19.04.43-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_19.04.43-300w.png&quot; alt=&quot;Screen_Shot_2020-01-25_at_19.04.43.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_19.04.43-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_19.04.43-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-25_at_19.04.43-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Seperti bagan diatas terlihat bedanya pustaka dengan framework. Angular dan Ember secara fitur sangat lengkap. Sementara Svelte, vue dan React cukup lengkap, sedangkan jQuery jauh dari lengkap karena memang jQuery pada dasarnya hanyalah pustaka untuk manipulasi DOM.&lt;/p&gt;
&lt;p&gt;Yang menarik dari bagan diatas ada satu pustaka atau framework yang tidak mendukung CDN yaitu Svelte. Hal ini dikarenakan Svelte adalah framework yang melakukan kompilasi JavaScript sehingga menjadi Vanilla JavaScript.&lt;/p&gt;
&lt;h3&gt;Mulai Menggunakan&lt;/h3&gt;
&lt;p&gt;Sekarang kita akan melihat bagaimana cara menggunakan masing-masing framework dan pustaka dengan cara yang paling mudah diikuti berdasarkan langkah-langkah yang disediakan oleh dokumentasi resmi. Ada beberapa framework yang menyarankan menggunakan CLI, dan ada beberapa yang lain tidak.&lt;/p&gt;
&lt;h4&gt;Angular&lt;/h4&gt;
&lt;p&gt;Untuk Angular, pertama kita instal alat bantu CLI dengan npm. Kemudian CLI kita gunakan untuk men-&lt;em&gt;generate&lt;/em&gt; proyek Angular baru. Serve untuk kemudian dibuka di browser.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; -g&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; @angular/cli&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;ng&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; jsday&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; jsday&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;ng&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; serve&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; --open&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kemudian kita akan membuat hello world, dengan komponen dengan membuat file baru &lt;code&gt;jsday.component.ts&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// src/app/jsday.component.ts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;@angular/core&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  selector:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;jsday&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  template:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;&amp;#x3C;h2&gt;JSDay 2019!!!&amp;#x3C;/h2&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; JSDayComponent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pertama kita buat file baru di &lt;code&gt;src/app/jsday.component.ts&lt;/code&gt;. Nah disini angular menyarankan kita menggunakan TypeScript sedari awal. Buat yang belum tahu, TypeScript adalah &lt;em&gt;subset&lt;/em&gt; dari JavaScript yang menambahkan salah satunya &lt;em&gt;type system&lt;/em&gt; kedalam JavaScript.&lt;/p&gt;
&lt;p&gt;Selanjutnya kita import component dari angular core. Lalu kita gunakan decorator component dengan nama selector atau tag yaitu jsday, dengan isinya header level 2. Jangan lupa kemudian juga di eksport komponen-nya.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// src/app/app.module.ts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;BrowserModule&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;@angular/platform-browser&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;NgModule&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;@angular/core&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;AppRoutingModule&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;./app-routing.module&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;AppComponent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;./app.component&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;JSDayComponent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;./jsday.component&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;NgModule&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  declarations:&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;AppComponent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;JSDayComponent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  imports:&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;BrowserModule&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;AppRoutingModule&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  providers:&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  bootstrap:&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;AppComponent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; AppModule&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kemudian kita akan menggunakan komponen jsday di file utama &lt;code&gt;app.module.ts&lt;/code&gt;. Import dan deklarasikan di decorator NgModule. Langkah terakhir, tinggal menggunakan komponen jsday di &lt;code&gt;app.component.html&lt;/code&gt; misalnya.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;&amp;#x3C;!-- src/app/app.component.html --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F44747&quot;&gt;jsday&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#F44747&quot;&gt;jsday&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Ember&lt;/h4&gt;
&lt;p&gt;Langkah-langkahnya hampir mirip dengan Angular, pertama kita lakukan instalasi alat bantu CLI. Kemudian kita Ggunakan CLI untuk men-generate proyek baru. Masuk ke direktor dan jalankan ember serve.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; -g&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; ember-cli&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;ember&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; jsday&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; jsday&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;ember&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; serve&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kita mulai dengan membuat komponen baru di file baru di &lt;code&gt;app/components/jsday.js&lt;/code&gt;. Import component dari pustaka &lt;code&gt;ember/component&lt;/code&gt;, dan kemudian di extend untuk membuat komponen baru.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// app/components/jsday.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; Component&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;@ember/component&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; Component&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;extend&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  componentMessage:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;JSDay 2019!!!&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dan kita buat sebuah file template dengan format handlebars dan menampilkan &lt;code&gt;message&lt;/code&gt; didalam tag header level 2.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;&amp;#x3C;!-- app/templates/components/jsday.hbs --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dan sekarang kita dapat menggunakan komponen jsday di template seperti ini.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;&amp;#x3C;!-- app/templates/application.hbs --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;jQuery&lt;/h4&gt;
&lt;p&gt;Untuk jQuery cukup straigthforward penggunaannya, buat sebuah folder dan sebuah file.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; jsday&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; jsday&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kemudian tambahkan CDN jQuery dan dapat segera digunakan.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;&amp;#x3C;!-- index.html --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;!&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;doctype&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; lang&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; charset&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;JSDay 2019!!&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      type&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      src&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;https://code.jquery.com/jquery-3.4.1.min.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;app&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;app.js&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Di file dengan ekstensi JavaScript, &lt;code&gt;app.js&lt;/code&gt; kita tambahkan header level 2 dengan pesan jsday 2019 didalamnya.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// app.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;ready&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; () {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;  $&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;#app&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;&amp;#x3C;h2&gt;JSDay 2019!!!&amp;#x3C;/h2&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;React&lt;/h4&gt;
&lt;p&gt;Bagaimana dengan React? Karena di tutorial resminya menggunakan CDN, maka kita akan menggunakan CDN. Langkah-langkahnya mirip dengan jQuery sebenarnya. Dimulai dengan membuat folder dan file html.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; jsday&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; jsday&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Gunakan CDN untuk pustaka react dan react-dom didalam file &lt;code&gt;index.html&lt;/code&gt;. Kodenya sendiri kita akan tulis di file terpisah &lt;code&gt;app.js&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;&amp;#x3C;!-- index.html --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;!&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;doctype&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; lang&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; charset&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;JSDay 2019&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      src&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;https://unpkg.com/react@16/umd/react.development.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      crossorigin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      src&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;https://unpkg.com/react-dom@16/umd/react-dom.development.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      crossorigin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;root&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;app.js&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Di app.js kita juga tidak menggunakan babel ataupun jsx. Komponen menggunakan sintaksis class, me-render sebuah komponen header leel 2 dengan teks JSDay 2019. Lalu kemudian kita render dengan ReactDOM dan di cemplungin ke div dengan id root.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// app.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;use strict&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; App&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; extends&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; React&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;  render&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; React&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;createElement&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;h2&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, {}, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;JSDay 2019!!!&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;ReactDOM&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;render&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;React&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;createElement&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;App&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;getElementById&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;root&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/react-300w.webp 300w, https://rizafahmi.com/img/react-600w.webp 600w, https://rizafahmi.com/img/react-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/react-300w.png&quot; alt=&quot;react&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/react-300w.png 300w, https://rizafahmi.com/img/react-600w.png 600w, https://rizafahmi.com/img/react-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h4&gt;Svelte&lt;/h4&gt;
&lt;p&gt;Sekarang kita masuk ke framework berikutnya, Svelte. Svelte memang tidak memiliki CLI bawaan seperti halnya Angular atau Ember. Tapi di dokumentasinya kita disarankan menggunakan tools yang namanya degit. Sederhananya degit ini melakukan clone template yang sudah disiapkan di git atau github untuk proyek svelte ataupun proyek lainnya secara umum. Setelah menjalankan degit dengan npx kita jalankan npm install dan jalankan dengan npm run dev.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; degit&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; sveltejs/template&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; jsday&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; jsday&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; install&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Selanjutnya kita buat komponen baru dengan header level 2 dengan nama &lt;code&gt;jsday.svelte&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;&amp;#x3C;!-- src/JSDay.svelte --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;JSDay 2019!!!&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dan kita tinggal gunakan komponen JSDay. Jangan lupa diimport agar dapat digunakan di komponen atau file lain.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;&amp;#x3C;!-- src/App.svelte --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  import&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; JSDay&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;./JSDay.svelte&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F44747&quot;&gt;JSDay&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Vue&lt;/h4&gt;
&lt;p&gt;Kita masuk ke framework terakhir yaitu Vue. Vue juga di awal tutorialnya menyarankan menggunakan CDN sama halnya seperti React dan jQuery. Jadi tinggal buat sebuah folder dan buat sebuah file html.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; jsday&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; jsday&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kemudian load vue dari CDN. Dan tulis kode vue di bagian script dibawah atau di file terpisah.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;&amp;#x3C;!-- index.html --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;!&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;doctype&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;JSDay 2019&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;https://unpkg.com/vue&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;app&quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;      var&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; app&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; Vue&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        el:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;#app&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        data:&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;          message:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;JSDay 2019!!!&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;        },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Dukungan Komunitas&lt;/h3&gt;
&lt;p&gt;Yang tidak kalah penting adalah dukungan komunitas di sekitar kita. Ketika kita belajar kita butuh dukungan komunitas. Kita butuh teman belajar. Proses belajar tentu akan lebih cepat.&lt;/p&gt;
&lt;p&gt;Tadi di bagian pertama kita sudah membahas tentang &lt;em&gt;meetup&lt;/em&gt;, grup di facebook dan grup telegram. Nah sekarang kita akan fokus gimana kalau kita kesulitan dan butuh mencari solusi jika menemukan masalah. Sayangnya belum ada forum tanya jawab **di Indonesia atau yang berbahasa Indonesia. Sehingga data diambil dari stackoverflow.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_17.42.44-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_17.42.44-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_17.42.44-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_17.42.44-300w.png&quot; alt=&quot;Screen_Shot_2020-01-26_at_17.42.44.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_17.42.44-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_17.42.44-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_17.42.44-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Disini jquery sangat jauh mengungguli jumlah pertanyaan karena memang yang paling senior, otomatis pertanyaan juga yang paling banyak. Kemudian diikuti Angular, React, Vue, Ember dan terakhir Svelte.&lt;/p&gt;
&lt;p&gt;Jika kita kelompokkan, ada empat kelompok. Kelompok pertama adalah jQuery yang sangat jauh berbeda. Kelompok kedua ada React dan Angular. Vue dan ember ada di kelompok ketiga. Svelte menjadi kelompok terakhir.&lt;/p&gt;
&lt;p&gt;Pertanyaan terkait Angular dan React banyak sekali, sementara dibandingkan kelompok kedua, vue dan Ember yang bisa dibilang hanya 1/4 nya saja. Ember dan Angular bisa diasumsikan umurnya mendekati jika dihitung dari angular versi pertama. React dan Vue lahirnya juga hampir bersamaan.&lt;/p&gt;
&lt;p&gt;Data berikutnya, sedikit seru-seruan, mari kita bandingkan pengikut masing-masing akun resmi tiap framework dan pustaka di twitter.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_17.57.01-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_17.57.01-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_17.57.01-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_17.57.01-300w.png&quot; alt=&quot;Screen_Shot_2020-01-26_at_17.57.01.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_17.57.01-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_17.57.01-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_17.57.01-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;React dan Angular cukup jauh meninggalkan teman-teman yang lainnya dari sisi pengikut atau &lt;em&gt;follower&lt;/em&gt; yang mencapai tiga ratus ribuan. Vue dan Ember juga cukup jauh sekitar seratus ribuan. Yang menarik jQuery pengikutnya paling sedikit. Bahkan sudah dilewati Svelte yang umurnya paling muda.&lt;/p&gt;
&lt;p&gt;Statistik berikutnya yang akan kita lihat adalah dari repositori GitHub.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.02.04-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.02.04-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.02.04-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.02.04-300w.png&quot; alt=&quot;Screen_Shot_2020-01-26_at_18.02.04.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.02.04-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.02.04-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.02.04-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Nah kalo di repositori GitHub, Vue cukup merajai. Disini seperti ada tiga kelompok:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Vue dan React,&lt;/li&gt;
&lt;li&gt;Angular dan jQuery,&lt;/li&gt;
&lt;li&gt;Svelte dan Ember&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Untuk jumlah &lt;em&gt;watches&lt;/em&gt; React merupakan pustaka yang paling banyak jumlah &#39;pengintainya&#39;.&lt;/p&gt;
&lt;p&gt;Masih dari repositori GitHub, beberapa statistik menarik lainnya, yaitu jumlah &lt;em&gt;commit&lt;/em&gt;, jumlah kontributor dan umurnya di GitHub.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.06.54-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.06.54-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.06.54-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.06.54-300w.png&quot; alt=&quot;Screen_Shot_2020-01-26_at_18.06.54.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.06.54-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.06.54-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.06.54-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Beberapa hal menarik disini pertama tentang Svelte. Dengan umur yang baru dua tahun bisa mengalahkan vue dari sisi jumlah &lt;em&gt;commit&lt;/em&gt;. Padahal jumlah kontributornya tidak terlalu jauh berbeda. Apakah artinya kontributorSsvelte menerapkan strategi &lt;em&gt;commit often&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;Disini juga dapat dilihat framework seperti Angular, React, dan Ember memiliki kontributor yang sangat banyak dibandingkan framework atau pustaka lainnya.&lt;/p&gt;
&lt;h3&gt;Pustaka Pendukung&lt;/h3&gt;
&lt;p&gt;Cepat atau lambat sebuah pustaka dan framework membutuhkan bantuan tambahan dalam bentuk pustaka atau &lt;em&gt;library&lt;/em&gt;, terutama untuk framework yang minimalis. Framework seperti Svelte atau pustaka jquery apalagi, pasti akan butuh pustaka tambahan. Nah disini saya melakukan pencarian dari npm dengan tag angular, ember, jquery, react, svlete dan vue.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.12.06-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.12.06-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.12.06-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.12.06-300w.png&quot; alt=&quot;Screen_Shot_2020-01-26_at_18.12.06.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.12.06-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.12.06-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.12.06-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Terlihat React melesat sendirian dengan jumlah pustaka terbanyak, nyaris lima puluh ribu. Disini terlihat jelas perbedaannya, React dipasarkan sebagai pustaka bukan framework, makanya banyak pustaka tambahan bermunculan. Bahkan beberapa pustaka &lt;em&gt;de facto&lt;/em&gt; seperti redux, react router, create react app muncul sebagai pustaka yang dikembangkan oleh komunitas. Meskipun React dikembangkan oleh Facebook.&lt;/p&gt;
&lt;p&gt;Kemudian framework seperti Angular dan Ember yang memang tidak terlalu membutuhkan pustaka tambahan karena memang secara fitur sudah cukup lengkap.&lt;/p&gt;
&lt;p&gt;Sedangkan Svelte jumlahnya sedikit, wajar karena masih baru. Namun ada yang menarik, meskipun bentuknya pustaka, jQuery pustaka tambahan sedikit sekali ada di npm. Mungkin karena diawal, jQuery hidupnya bukan di npm. jQuery lahir lebih dulu sebelum ada npm.&lt;/p&gt;
&lt;h3&gt;Performa&lt;/h3&gt;
&lt;p&gt;Nah sekarang kita masuk ke pembahasan yang cukup menarik dibahas, yaitu performa. Salah satu konsiderasi developer senior adalah seberapa cepat sebuah framework memanjakan penggunanya dalam hal kecepatan.&lt;/p&gt;
&lt;p&gt;Disini saya tidak menggunakan metode benchmark yang kadang ‘menyesatkan’ dan subjektif, namun saya akan menggunakan metode yang sebenarnya cukup subjektif, yaitu Chrome UX Report. Chrome UX Report adalah data yang secara anonymous didapat dari pengguna browser chrome. Jadi disini pengguna browser lain tidak dihitung. Data diambil dari 2014 hingga awal september 2019.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.17.03-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.17.03-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.17.03-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.17.03-300w.png&quot; alt=&quot;Screen_Shot_2020-01-26_at_18.17.03.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.17.03-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.17.03-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.17.03-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Dari Chrome UX Report saya bisa mendapatkan informasi jumlah pengguna yang mengakses website. Dari situ kemudian dipilah lagi website yang diakses menggunakan framework apa.&lt;/p&gt;
&lt;p&gt;Hasilnya, ternyata penggunaan pustaka dan framework dunia masih dikuasai secara dominan oleh jQuery. Hanya 10 persen sisanya dibagi-bagi ke framework dan pustaka lainnya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.18.35-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.18.35-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.18.35-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.18.35-300w.png&quot; alt=&quot;Screen_Shot_2020-01-26_at_18.18.35.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.18.35-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.18.35-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.18.35-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Untuk performanya sendiri. Kita akan lihat dua metrik: first contentful paint dan first input delay. First Contentful Paint atau FCP adalah saat pertama kali konten atau isi dari sebuah web atau dicetak ke browser. FCP bergantung pada performa server rendered, dan seberapa efektif sebuah framework melakukan proses rendering.&lt;/p&gt;
&lt;p&gt;Sedangkan First Input Delay atau FID adalah seberapa lama waktu yang dibutuhkan agar pengguna dapat berinteraksi dengan aplikasi web kita, seperti scroll, klik, ketik dan lain sebagainya. FID biasanya bergantung ke ukuran aplikasi atau ukuran pustaka atau framework itu sendiri.&lt;/p&gt;
&lt;p&gt;Dan secara umum yang memiliki performa tercepat adalah Ember. Svelte sendiri memiliki kemampuan FID tercepat karena memang JavaScript yang dihasilkan termasuk yang paling kecil.&lt;/p&gt;
&lt;h3&gt;Lowongan Pekerjaan&lt;/h3&gt;
&lt;p&gt;Setelah belajar framework baru, dan sudah mendapatkan gambaran performa untuk masing-masing pustaka atau framework, sekarang kita akan mencoba menjawab kira-kira dari daftar framework ini prospek nya gimana saat ini dan kedepannya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.22.48-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.22.48-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.22.48-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.22.48-300w.png&quot; alt=&quot;Screen_Shot_2020-01-26_at_18.22.48.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.22.48-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.22.48-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.22.48-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Pertama kita lihat jumlah lowongan pekerjaan tersedia di dunia. Disini saya melakukan pencarian data di stackoverflow jobs dan upwork untuk pekerjaan lepas atau &lt;em&gt;freelance&lt;/em&gt; dan juga &lt;em&gt;remote working. S&lt;/em&gt;engaja saya tampilkan data seluruh dunia supaya bisa dikomparasi juga dengan perkembangan di Indonesia. Untuk stackoverflow jobs sendiri, talenta jQuery terlihat sudah mulai menurun. Lowongan React paling banyak, diikuti Angular, jQuery, Vue dan Ember.&lt;/p&gt;
&lt;p&gt;Dan untuk data dari upwork, jQuery masih merajai. Jauh sekali dibandingkan React, Angular, Vue, Ember dan diikuti dengan Svelte.&lt;/p&gt;
&lt;p&gt;Bagaimana dengan lowongan pekerjaan di Indonesia? Disini saya menyajikan data dari dua sumber: LinkedIn dan juga Urbanhire.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.46.27-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.46.27-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.46.27-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.46.27-300w.png&quot; alt=&quot;Screen_Shot_2020-01-26_at_18.46.27.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.46.27-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.46.27-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.46.27-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Dan ternyata masih banyak sekali yang mencari developer yang bisa jQuery, nyaris mencapai tiga ribu lowongan. Sementara lowongan rReact dan yang lainnya berkisar di enam ratus atau lebih rendah. Data dari Linkedin ini sedikit bias karena saya melakukan proses pencarian di LinkedIn pribadi. Kemungkinan besar di lingkaran saya masih banyak yang membuka lowongan yang membutuhkan kemampuan jQuery.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.48.52-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.48.52-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.48.52-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.48.52-300w.png&quot; alt=&quot;Screen_Shot_2020-01-26_at_18.48.52.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.48.52-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.48.52-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.48.52-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Saya juga melakukan pencarian data lowongan di Urbanhire yang mungkin lebih objektif dan tidak bias. Di platform pencarian lowongan pekerjaan di Indonesia ini, ternyata jumlah lowongan React lebih banyak dari jQuery dan yang lainnya meski tidak terlalu signifikan perbedaannya. Cukup berimbang.&lt;/p&gt;
&lt;h2&gt;Sudut Pandang Master&lt;/h2&gt;
&lt;p&gt;Dan di bagian ini kita akan menjawab pertanyaan-pertanyaan dari golongan yang termasuk kedalam pengambil keputusan seperti team lead, arsitek, Vice President of Engineering hingga Chief Technology Officer atau CTO. Dan kita akan melihat beberapa hal seperti: jumlah talenta tersedia dan tingkat maturity dari sebuah framework atau pustaka.&lt;/p&gt;
&lt;h3&gt;Talenta Tersedia&lt;/h3&gt;
&lt;p&gt;Disini saya kembali menggunakan fitur pencarian di &lt;a href=&quot;https://linkedin.com/in/rizafahmi&quot;&gt; LinkedIn &lt;/a&gt; untuk mencari banyaknya talenta untuk setiap framework dan pustaka.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.55.10-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.55.10-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.55.10-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.55.10-300w.png&quot; alt=&quot;Screen_Shot_2020-01-26_at_18.55.10.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.55.10-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.55.10-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.55.10-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Dan ternyata yang menguasai jQuery masih sangat banyak baik di Indonesia ataupun di dunia. Dan jaraknya masih cukup jauh antara jQuery dengan framework lainnya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.56.22-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.56.22-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.56.22-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.56.22-300w.png&quot; alt=&quot;Screen_Shot_2020-01-26_at_18.56.22.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.56.22-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.56.22-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_18.56.22-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Dan berikut data yang ada di database &lt;a href=&quot;https://geekhunter.co/&quot;&gt; geekhunter &lt;/a&gt;. Seperti yang bisa dilihat, jQuery masih merupakan pustaka yang paling banyak dikuasai.&lt;/p&gt;
&lt;h3&gt;Tingkat Maturity&lt;/h3&gt;
&lt;p&gt;Dibagian ini kita akan membahas tentang kedewasaan framework atau maturity. Disini kita akan melihat hal-hal seperti &lt;em&gt;release cycle&lt;/em&gt;, jumlah pengelola, &lt;em&gt;issues&lt;/em&gt;, &lt;em&gt;pull request&lt;/em&gt; dan juga &lt;em&gt;testing.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.15.22-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.15.22-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.15.22-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.15.22-300w.png&quot; alt=&quot;Screen_Shot_2020-01-26_at_19.15.22.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.15.22-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.15.22-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.15.22-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Disini data saya dapatkan dari GitHub dan terlihat ada beberapa &lt;em&gt;insight&lt;/em&gt; menarik. Pertama yang menarik adalah Svelte. Framework termuda disini rilis per tahunnya paling tinggi. Wajar karena masih baru, jadi jangan kaget kalau masih sering terjadi perubahan API atau belum stabil. Bandingkan dengan jQuery yang secara umur adalah yang paling tua. Rilis per tahunnya paling kecil karena sudah berumur 10 tahun.&lt;/p&gt;
&lt;p&gt;Repositori yang paling produktif adalah Angular dalam hal jumlah &lt;em&gt;commit&lt;/em&gt;. Nyaris empat ribu &lt;em&gt;commit&lt;/em&gt; per tahun. Dan Angular memiliki &lt;em&gt;release cycle&lt;/em&gt; cukup tinggi dibandingkan framework lain, mungkin karena umurnya tergolong lebih muda. Disini saya hanya menggunakan repositori Angular versi kedua atau yang lebih baru, bukan Angular versi pertama. Sedangkan Ember adalah satu-satunya framework yang menggunakan metode release cycle secara konsisten. Menghasilkan rilis baru setiap 6 minggu.&lt;/p&gt;
&lt;p&gt;React sendiri meskipun disini umurnya 6 tahun namun React sudah dikembangkan dan digunakan jauh sebelum itu. Angka 6 tahun disini adalah umur saat kodenya menjadi sumber terbuka atau open source.&lt;/p&gt;
&lt;p&gt;Berikutnya kita melihat jumlah issue di GitHub. Issue github ini merupakan salah satu metrik untuk menilai apakah sebuah proyek open source itu sehat atau tidak.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.42.03-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.42.03-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.42.03-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.42.03-300w.png&quot; alt=&quot;Screen_Shot_2020-01-26_at_19.42.03.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.42.03-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.42.03-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.42.03-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Disini Angular adalah pemilik issues terbanyak baik yang sudah selesai atau &lt;em&gt;closed&lt;/em&gt; maupun yang masih belum diselesaikan atau &lt;em&gt;open.&lt;/em&gt; Perbedaannya cukup signifikan. Hal ini mungkin disebabkan karena Angular punya banyak fitur yang harus dikembangkan dan dikelola. Namun Ember dengan fitur yang cukup lengkap juga jumlah &lt;em&gt;issue&lt;/em&gt;-nya tidak sebanyak Angular, bahkan lebih sedikit jika dibandingkan React dan Vue.&lt;/p&gt;
&lt;p&gt;Svelte adalah satu-satunya framework yangjumlah open issue-nya lebih banyak daripada yang closed. Mungkin karena mereka sedang &lt;em&gt;heavy development&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Berikutnya kita melihat seberapa banyak pull request atau PR yang terjadi.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.45.08-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.45.08-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.45.08-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.45.08-300w.png&quot; alt=&quot;Screen_Shot_2020-01-26_at_19.45.08.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.45.08-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.45.08-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.45.08-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;jQuery sudah tidak terlalu banyak pull request yang open karena mungkin sudah cukup &lt;em&gt;mature&lt;/em&gt; atau sudah tidak terlalu banyak fitur yang dikembangkan. Atau juga sudah tidak memiliki banyak bugs. Sedangkan kontributor Angular ternyata adalah yang paling produktif mengirimkan pull request sementara Vue memiliki jumlah pull request yang paling sedikit.&lt;/p&gt;
&lt;p&gt;Selanjutnya kita akan melihat sebeapa banyak testing yang dilakukan oleh masing-masing framework dibandingkan dengan jumlah baris kode.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.46.52-300w.webp 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.46.52-600w.webp 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.46.52-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.46.52-300w.png&quot; alt=&quot;Screen_Shot_2020-01-26_at_19.46.52.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;750&quot; srcset=&quot;https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.46.52-300w.png 300w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.46.52-600w.png 600w, https://rizafahmi.com/img/Screen_Shot_2020-01-26_at_19.46.52-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Angular memiliki baris kode yang paling banyak dengan jumlah test case juga yang paling banyak. Yang agak mengejutkan disini adalah Ember ternyata jumlah baris kodenya hampir sama dengan Vue tapi dengan jumlah test case yang lebih banyak bahkan lebih banyak dibandingkan React. Svelte juga jumlah test case-nya cukup banyak jika dibandingkan dengan jumlah baris kodenya, secara rasio.&lt;/p&gt;
&lt;p&gt;Maksud saya menampilkan data ini bukan untuk adu siapa yang paling banyak jumlah test, tapi lebih melihat gambaran &lt;em&gt;framework&lt;/em&gt; mana yang peduli dengan testing. Dan data ini bisa jadi bereleasi dengan seberapa mudah aplikasi kita di test nantinya.&lt;/p&gt;
&lt;h2&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Masa-masa saat ini adalah masa yang sangat menyenangkan dan &lt;em&gt;exciting&lt;/em&gt; terutama untuk developer JavaScript. Ekosistem pendukung semakin matang, pilihan untuk belajar sangat banyak, begitu juga media dan pilihan cara belajar. Bisa belajar dari artikel, buku hingga format video. Ada pustaka atau framework yang sangat &lt;em&gt;developer friendly&lt;/em&gt;, dengan beberapa langkah kita sudah bisa membuat aplikasi. Ada juga yang sangat &lt;em&gt;user friendly&lt;/em&gt; dalam artian mungkin untuk &lt;em&gt;development&lt;/em&gt; butuh waktu yang agak panjang dan tidak semudah yang lain, namun hasil akhirnya sangat memanjakan. Aplikasinya cepat dan ringan tidak memberatkan pengguna.&lt;/p&gt;
&lt;p&gt;Teman-teman bisa jadikan statistik-statistik ini sebagai bahan untuk &lt;em&gt;learning path&lt;/em&gt;. Baru belajar? Mulai dari sudut pandang pertama: junior. Buat yang ingin belajar hal baru bisa dilihat dari sudut pandang kedua: senior. Mau bikin produk atau membangun tim? Konsiderasi hal-hal yang kita bahas di sudut pandang ketiga.&lt;/p&gt;
&lt;p&gt;Apapun piilihan teman-teman, yang penting semua itu bisa membantu teman-teman dalam berkarya, baik karya yang sederhana hingga karya yang luar biasa.&lt;/p&gt;
&lt;p&gt;Untuk sudut pandang pengambil keputusan, meskipun memilih teknologi berdasarkan &lt;em&gt;hype&lt;/em&gt; atau tren bukanlah hal yang salah, tapi perlu dikonsiderasi juga talenta tersedia dan jika saya diperbolehkan menambahkan opini pribadi, kadang kita perlu melawan arus, melakukan apa yang tidak dilakukan orang lain, anti mainstream.&lt;/p&gt;
&lt;p&gt;Ada yg namanya &lt;a href=&quot;http://www.paulgraham.com/pypar.html&quot;&gt; python paradox &lt;/a&gt; dimana kita sengaja pilih teknologi yang jarang digunakan agar memikat talenta-talenta yang memang tertarik dengan teknologi tersebut sekaligus tidak perlu bersaing dengan para &lt;em&gt;unicorn&lt;/em&gt; untuk merekrut developer. Ada juga yang mengambil jalur untuk memilih teknologi yang sudah matang, &lt;em&gt;obvious&lt;/em&gt;, teknologi yang sudah membosankan, &lt;em&gt;boring technology club&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Tujuan disajikannya data ini bukan untuk melihat framework atau pustaka mana yang paling bagus, tapi lebih kepada framework atau pustaka mana yang cocok buat kita dari ketiga sudut pandang tadi.&lt;/p&gt;
&lt;hr class=&quot;border-b&quot; /&gt;
&lt;p&gt;PS: Terimakasih banyak saya ucapkan kepada beberapa teman yang sudah membantu menyusun materi ini. Orang pertama yang saya hubungi ketika mulai menyusun topik ini adalah &lt;a href=&quot;https://twitter.com/tyohan&quot;&gt;Yohan Totting&lt;/a&gt;. Dari awal &lt;em&gt;brainstorm&lt;/em&gt; materi sampai hari h di mentorin oleh beliau.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-theme=&quot;dark&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;&lt;img src=&quot;https://pbs.twimg.com/media/EB7kz-iU8AI2rwz?format=jpg&amp;name=4096x4096&quot; alt=&quot;notes&quot; /&gt; Helping &lt;a href=&quot;https://twitter.com/rizafahmi22?ref_src=twsrc%5Etfw&quot;&gt;@rizafahmi22&lt;/a&gt; to prepare his keynote for &lt;a href=&quot;https://twitter.com/hashtag/JSDayID?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#JSDayID&lt;/a&gt; &lt;a href=&quot;https://t.co/miuEfuqNzz&quot;&gt;pic.twitter.com/miuEfuqNzz&lt;/a&gt;&lt;/p&gt;&amp;mdash; Yohan Totting (@tyohan) &lt;a href=&quot;https://twitter.com/tyohan/status/1161617348228292610?ref_src=twsrc%5Etfw&quot;&gt;August 14, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;Terimakasih juga buat &lt;a href=&quot;https://www.instagram.com/herlambang_srihartono/&quot;&gt; Herlambang&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/rizqme&quot;&gt; Rizqi &lt;/a&gt; dan &lt;a href=&quot;https://twitter.com/hismamaz&quot;&gt; Hisma &lt;/a&gt; alias Mamaz yang juga ikut &lt;em&gt;brainstorming&lt;/em&gt; dari awal. Terimakasih juga untuk &lt;a href=&quot;https://twitter.com/JecelynYeen&quot;&gt; Jecelyn Yeen &lt;/a&gt; yang menghubungkan saya dengan salah satu kontributor Angular. Tak lupa terimakasih untuk om &lt;a href=&quot;https://www.facebook.com/luridarmawan/&quot;&gt;Luri Darmawan&lt;/a&gt; yang sudah membagikan data terkait percakapan di telegram via &lt;a href=&quot;https://carik.id/&quot;&gt;carikbot&lt;/a&gt; dan juga &lt;a href=&quot;https://twitter.com/kenratriiswari&quot;&gt; Ken Ratri &lt;/a&gt; dari &lt;a href=&quot;http://geekhunter.co/&quot;&gt; geekhunter &lt;/a&gt; yang udah bagi data talenta di Indonesia.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/jecelyn-300w.webp 300w, https://rizafahmi.com/img/jecelyn-600w.webp 600w, https://rizafahmi.com/img/jecelyn-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/jecelyn-300w.png&quot; alt=&quot;Jecelyn&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/jecelyn-300w.png 300w, https://rizafahmi.com/img/jecelyn-600w.png 600w, https://rizafahmi.com/img/jecelyn-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Memahami Sistem Konkurensi BEAM Melalui Elixir</title>
    <link href="https://rizafahmi.com/2019/04/29/memahami-beam/"/>
    <updated>2019-04-29T00:00:00Z</updated>
    <pubDate>2019-04-29T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2019/04/29/memahami-beam/</id>
    <summary>Salah satu kontribusi besar Joe Armstrong yang ketika tulisan ini dibuat baru saja meninggal dunia adalah bahasa pemrograman Erlang beserta BEAM, atau yang lebih dikenal dengan Erlang Virtual Machine. Erlang VM cukup…</summary>
    <category term="catatan, elixir, otp"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/memahami-beam.png"/>
    <content type="html">&lt;p&gt;Salah satu kontribusi besar &lt;a href=&quot;https://twitter.com/FrancescoC/status/1119596234166218754&quot;&gt; Joe Armstrong &lt;/a&gt; yang ketika tulisan ini dibuat baru saja meninggal dunia adalah bahasa pemrograman Erlang beserta BEAM, atau yang lebih dikenal dengan Erlang Virtual Machine. Erlang VM cukup terkenal kehebatannya terutama ketika &lt;a href=&quot;http://highscalability.com/blog/2014/3/31/how-whatsapp-grew-to-nearly-500-million-users-11000-cores-an.html&quot;&gt; mampu menangani 2 juta koneksi per server di aplikasi chat WhatsApp! &lt;/a&gt; Di artikel ini kita akan membedah mekanisme dibalik kemampuan konkurensi yang dimiliki BEAM dengan bahasa pemrograman Elixir. Meskipun demikian, semua yang akan dilakukan di artikel ini dapat pula diimplementasikan di bahasa pemrograman lain yang juga berjalan di BEAM atau Erlang VM seperti Erlang, LFE, Alpaca, Gleam dan lain-lain.&lt;/p&gt;
&lt;h2&gt;Mekanisme Konkurensi di BEAM&lt;/h2&gt;
&lt;p&gt;Ide utama dari BEAM berpusat di sesuatu yang disebut dengan proses atau process. Proses sederhananya adalah program yang berjalan secara sekuensial, baris-per-baris dan tidak dapat berjalan secara paralel atau menjalankan pola konkurensi.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/process-300w.webp 300w, https://rizafahmi.com/img/process-480w.webp 480w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/process-300w.png&quot; alt=&quot;process&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;480&quot; height=&quot;311&quot; srcset=&quot;https://rizafahmi.com/img/process-300w.png 300w, https://rizafahmi.com/img/process-480w.png 480w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Untuk membuatnya menjadi konkuren, kita harus menjalankan proses lebih dari satu. Di Elixir, hal ini bisa kita lakukan dengan fungsi &lt;code&gt;spawn&lt;/code&gt;. Dan ketika kita melakukan spawn, aplikasi kita akan memiliki dua proses yang berjalan bersamaan. Proses disini bukanlah proses di level sistem operasi. Proses di BEAM sangat ringan, hanya beberapa kilobytes saja dan kita dapat memiliki proses sebanyak yang kita mau. Satu mesin bisa memiliki hingga 268 juta proses!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/spawn-300w.webp 300w, https://rizafahmi.com/img/spawn-480w.webp 480w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/spawn-300w.png&quot; alt=&quot;spawn&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;480&quot; height=&quot;208&quot; srcset=&quot;https://rizafahmi.com/img/spawn-300w.png 300w, https://rizafahmi.com/img/spawn-480w.png 480w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Sebenarnya kita akan memiliki dua program independen yang berjalan terpisah satu
dengan yang lainnya. Mereka tidak berbagi &lt;em&gt;state&lt;/em&gt; atau apapun, dan tidak memiliki
kesamaan sama sekali. Berada di memori, &lt;em&gt;stack, heap&lt;/em&gt; yang berbeda, dan juga
&lt;em&gt;garbage collector&lt;/em&gt; sendiri-sendiri dan tidak saling mengganggu.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/processes-300w.webp 300w, https://rizafahmi.com/img/processes-600w.webp 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/processes-300w.png&quot; alt=&quot;proses&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;600&quot; height=&quot;220&quot; srcset=&quot;https://rizafahmi.com/img/processes-300w.png 300w, https://rizafahmi.com/img/processes-600w.png 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Dan satu-satunya cara untuk membuat kedua proses yang berbeda tadi untuk dapat
bekerjasama adalah dengan saling berkirim pesan. Hal ini juga dikenal dengan
pola konkurensi melalui berkirim pesan (message passing concurrency) atau lebih
dikenal dengan actor model. Pola ini mirip dengan ide mircoservice dimana setiap
service terpisah satu dengan yang lain dan saling berhubungan dengan protokol
HTTP.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/processes_link-300w.webp 300w, https://rizafahmi.com/img/processes_link-600w.webp 600w, https://rizafahmi.com/img/processes_link-773w.webp 773w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/processes_link-300w.png&quot; alt=&quot;processes link&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;773&quot; height=&quot;262&quot; srcset=&quot;https://rizafahmi.com/img/processes_link-300w.png 300w, https://rizafahmi.com/img/processes_link-600w.png 600w, https://rizafahmi.com/img/processes_link-773w.png 773w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Misalkan proses pertama mengirimkan pesan ke proses kedua. Proses pertama mengirimkan pesan dengan fungsi &lt;code&gt;send&lt;/code&gt; dan proses kedua menerima fungsi dengan blok &lt;code&gt;receive&lt;/code&gt; dan kemudian menangani permintaan dari proses pertama.&lt;/p&gt;
&lt;p&gt;Ketika aplikasi dijalankan, yang terjadi adalah sebuah proses di sistem operasi
akan muncul. Yap, hanya satu proses di level sistem operasi. Di dalam proses inilah semua proses yang kita &lt;code&gt;spawn&lt;/code&gt; akan berjalan. Proses-proses yang berjalan secara sekuensial, independen, dan ringan.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/activity-300w.webp 300w, https://rizafahmi.com/img/activity-600w.webp 600w, https://rizafahmi.com/img/activity-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/activity-300w.png&quot; alt=&quot;activity&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;896&quot; srcset=&quot;https://rizafahmi.com/img/activity-300w.png 300w, https://rizafahmi.com/img/activity-600w.png 600w, https://rizafahmi.com/img/activity-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/BEAM-300w.webp 300w, https://rizafahmi.com/img/BEAM-600w.webp 600w, https://rizafahmi.com/img/BEAM-773w.webp 773w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/BEAM-300w.png&quot; alt=&quot;BEAM&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;773&quot; height=&quot;368&quot; srcset=&quot;https://rizafahmi.com/img/BEAM-300w.png 300w, https://rizafahmi.com/img/BEAM-600w.png 600w, https://rizafahmi.com/img/BEAM-773w.png 773w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Proses disini bukanlah proses di level sistem operasi. Proses di BEAM sangat ringan, hanya beberapa kilobytes saja dan kita dapat memiliki proses sebanyak yang kita mau. Satu mesin bisa memiliki hingga 268 juta proses!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/BEAM-Processes-300w.webp 300w, https://rizafahmi.com/img/BEAM-Processes-600w.webp 600w, https://rizafahmi.com/img/BEAM-Processes-773w.webp 773w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/BEAM-Processes-300w.png&quot; alt=&quot;BEAM-Processes&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;773&quot; height=&quot;369&quot; srcset=&quot;https://rizafahmi.com/img/BEAM-Processes-300w.png 300w, https://rizafahmi.com/img/BEAM-Processes-600w.png 600w, https://rizafahmi.com/img/BEAM-Processes-773w.png 773w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;BEAM secara internal kemudian menjalankan threads yang diberi nama penjadwal atau scheduler. Satu penjadwal untu satu inti dari CPU. Jika kita memiliki CPU dengan empat inti, maka penjadwalnya ada empat.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/BEAM-Scheduler-300w.webp 300w, https://rizafahmi.com/img/BEAM-Scheduler-600w.webp 600w, https://rizafahmi.com/img/BEAM-Scheduler-773w.webp 773w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/BEAM-Scheduler-300w.png&quot; alt=&quot;scheduler&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;773&quot; height=&quot;512&quot; srcset=&quot;https://rizafahmi.com/img/BEAM-Scheduler-300w.png 300w, https://rizafahmi.com/img/BEAM-Scheduler-600w.png 600w, https://rizafahmi.com/img/BEAM-Scheduler-773w.png 773w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Penjadwal ini yang bertanggungjawab mengeksekusi proses-proses. Sederhananya,
proses akan mengantri di satu jalur dan setiap penjadwal akan bergiliran
mengambil satu proses dan kemudian mengeksekusinya hingga proses tersebut
selesai dan akan mengambil proses di antrian berikutnya. Begitu seterusnya.&lt;/p&gt;
&lt;h2&gt;Praktek Menggunakan Konkurensi BEAM&lt;/h2&gt;
&lt;p&gt;Sekarang pertanyaannya, bagaimana cara kita melakukan implementasi pola proses di aplikasi atau sistem yang kita kembangkan? Bagaimana caranya kita memisahkan tugas-tugas sehingga menjadi proses-proses kecil dan independen? Mari kita lihat demo aplikasi berikut ini.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/dasbor-300w.webp 300w, https://rizafahmi.com/img/dasbor-600w.webp 600w, https://rizafahmi.com/img/dasbor-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/dasbor-300w.png&quot; alt=&quot;dasbor&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;646&quot; srcset=&quot;https://rizafahmi.com/img/dasbor-300w.png 300w, https://rizafahmi.com/img/dasbor-600w.png 600w, https://rizafahmi.com/img/dasbor-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Jobs&lt;/em&gt; adalah proses yang melakukan &lt;em&gt;infinite loop&lt;/em&gt;. Didalam &lt;em&gt;loop&lt;/em&gt; ada tugas
yang dapat menyebabkan &lt;em&gt;CPU bound&lt;/em&gt; untuk melakukan simulasi tugas yang cukup
berat. Selanjutnya setiap proses yang ditelurkan (&lt;em&gt;spawn&lt;/em&gt;), pada ilustrasi
diatas terdapat 10.000 proses. Setelah proses selesai mengerjakan tugasnya, ia
akan mengirimkan pesan ke proses lain yang tugasnya melakukan pencatatan bahwa
proses berhasil dieksekusi atau tidak berhasil. Proses-proses yang melakukan
tugas berat kemudian ditidurkan (&lt;em&gt;sleep&lt;/em&gt;) selama satu detik dan hidup kembali. Begitu seterusnya.&lt;/p&gt;
&lt;p&gt;Di demo ini kita hanya menggunakan satu penjadwal (&lt;em&gt;scheduler&lt;/em&gt;) saja, bukan empat meskipun memiliki empat inti CPU. Tujuannya agar memudahkan saja untuk membuat sibuk CPU.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/frontend-300w.webp 300w, https://rizafahmi.com/img/frontend-600w.webp 600w, https://rizafahmi.com/img/frontend-1146w.webp 1146w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/frontend-300w.png&quot; alt=&quot;frontend&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1146&quot; height=&quot;648&quot; srcset=&quot;https://rizafahmi.com/img/frontend-300w.png 300w, https://rizafahmi.com/img/frontend-600w.png 600w, https://rizafahmi.com/img/frontend-1146w.png 1146w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Kemudian di halaman yang dapat diakses pengguna, aplikasinya cukup sederhana namun sudah cukup mewakili aplikasi web secara umum. Ada sebuah input teks yang dapat menerima bilangan bulat positif dan ketika disubmit aplikasi akan menghitung jumlah dari angka tersebut berurutan dari angka satu. Misalnya kita memasukkan angka 3 maka hasilnya menjadi 1 + 2 + 3 yaitu 6 atau jika kita memasukkan angka 4 maka hasilnya menjadi 10 dan seterusnya. Berikut cuplikan kode dari proses kalkulasinya.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;defp&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; calc_sum&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(n), do: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;calc_sum&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, n, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;defp&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; calc_sum&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(from, from, sum), do: sum + from&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;defp&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; calc_sum&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(from, to, acc_sum), do: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;calc_sum&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(from + &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, to, acc_sum + from)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Setiap ada yang membuka halaman ini koneksi akan terbentuk antara klien dan server atau sistem. Dan ketika pengguna memasukkan angka 3 maka sistem akan melakukan perhitungan dan mengembalikan hasilnya dalam hal ini angka 6.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/client-server-285w.webp 285w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/client-server-285w.png&quot; alt=&quot;client-server&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;285&quot; height=&quot;341&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Dan misalkan ada tiga pengguna yang mengakses secara bersamaan, maka akan ada tiga koneksi. Satu untuk setiap pengguna atau setiap sesi (&lt;em&gt;session&lt;/em&gt;). Begitu pula jika ada 1000 orang, akan ada 1000 koneksi yang terjadi antar proses dan begitu seterusnya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/clients-servers-300w.webp 300w, https://rizafahmi.com/img/clients-servers-600w.webp 600w, https://rizafahmi.com/img/clients-servers-899w.webp 899w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/clients-servers-300w.png&quot; alt=&quot;clients-servers&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;899&quot; height=&quot;271&quot; srcset=&quot;https://rizafahmi.com/img/clients-servers-300w.png 300w, https://rizafahmi.com/img/clients-servers-600w.png 600w, https://rizafahmi.com/img/clients-servers-899w.png 899w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;We do not have one web server handling 2 millions sessions. We have 2 millions web servers handling one session each.&amp;quot; -- Joe Armstrong&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Proses kalkulasinya sendiri terjadi di proses yang berbeda. Koneksi menelurkan (&lt;em&gt;spawn&lt;/em&gt;) proses baru, kita sebut saja sebagai &lt;em&gt;calculation&lt;/em&gt;. Proses &lt;em&gt;calculation&lt;/em&gt; melakukan kalkulasi dan mengirimkan hasilnya kembali ke proses &lt;em&gt;server&lt;/em&gt; untuk seterusnya diteruskan ke proses &lt;em&gt;client&lt;/em&gt;. Kemudian proses &lt;em&gt;calculation&lt;/em&gt; berhenti dan mati karena sudah menyelesaikan pekerjaannya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/server-calculation-300w.webp 300w, https://rizafahmi.com/img/server-calculation-436w.webp 436w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/server-calculation-300w.png&quot; alt=&quot;server-calculation&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;436&quot; height=&quot;341&quot; srcset=&quot;https://rizafahmi.com/img/server-calculation-300w.png 300w, https://rizafahmi.com/img/server-calculation-436w.png 436w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Pola seperti ini dibentuk dengan harapan sistem akan menjadi &lt;em&gt;fault-tolerant&lt;/em&gt; dan &lt;em&gt;high availability&lt;/em&gt; untuk menghasilkan servis yang tetap berjalan meski terjadi masalah di &lt;em&gt;production&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Situasi yang umum ditemui di &lt;em&gt;production&lt;/em&gt;, misalnya ada kesalahan, yang akan menghasilkan kesalahan yang belum ditangani (&lt;em&gt;unhandled exception&lt;/em&gt;) seperti &lt;code&gt;division by zero&lt;/code&gt; atau &lt;code&gt;undefined is not a function&lt;/code&gt;. Coba masukkan angka keberuntungan: 13! Terjadi kesalahan dan pesan kesalahan muncul di server.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/13error-300w.webp 300w, https://rizafahmi.com/img/13error-600w.webp 600w, https://rizafahmi.com/img/13error-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/13error-300w.png&quot; alt=&quot;13 error&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;322&quot; srcset=&quot;https://rizafahmi.com/img/13error-300w.png 300w, https://rizafahmi.com/img/13error-600w.png 600w, https://rizafahmi.com/img/13error-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Namun menariknya, sistem tetap berjalan normal. Kita tetap bisa memasukkan angka lain selain angka 13 dan sistem tetap memberikan hasil yang tepat. Hanya satu proses &lt;em&gt;calculation&lt;/em&gt; angka 13 saja yang bermasalah dan mati.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Catatan penting&lt;/strong&gt;: Sampai tahapan ini kita berhasil memisahkan kesalahan-kesalahan (&lt;em&gt;failures&lt;/em&gt;) dengan cara mendelegasikannya kedalam proses-proses kecil.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/running-300w.webp 300w, https://rizafahmi.com/img/running-600w.webp 600w, https://rizafahmi.com/img/running-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/running-300w.png&quot; alt=&quot;running&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;610&quot; srcset=&quot;https://rizafahmi.com/img/running-300w.png 300w, https://rizafahmi.com/img/running-600w.png 600w, https://rizafahmi.com/img/running-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2&gt;Praktek Sistem Latensi&lt;/h2&gt;
&lt;p&gt;Mari kita coba memasukkan angka yang cukup besar agar sistem bisa menghitung lebih lama seperti angka 999999999. Otomatis load di dasbor pun meningkat. Meski demikian, sistem tetap reaktif menerima angka lain sambil menunggu hasil dari 999999999! Hal ini karena yang sibuk menghitung hanyalah satu proses saja. Proses lainnya dapat berjalan normal seperti tidak terjadi apa-apa. Buat saya, ini adalah definisi dari &lt;em&gt;high availability&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/availability-300w.webp 300w, https://rizafahmi.com/img/availability-600w.webp 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/availability-300w.png&quot; alt=&quot;availability&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;600&quot; height=&quot;264&quot; srcset=&quot;https://rizafahmi.com/img/availability-300w.png 300w, https://rizafahmi.com/img/availability-600w.png 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2&gt;Simulasi Kesalahan Yang Lebih Fatal&lt;/h2&gt;
&lt;p&gt;Sekarang kita akan melihat kesalahan yang lebih berbahaya. Kita akan memasukkan
angka negatif, misalnya -1 yang akan menyebabkan CPU menjadi 100% karena sistem
yang dikembangkan sebenarnya hanya menerima bilangan bulat negatif. Namun kita
lupa untuk menangani jika pengguna memasukkan angka negatif. Hal yang biasa
terjadi kan?!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/negatif-300w.webp 300w, https://rizafahmi.com/img/negatif-600w.webp 600w, https://rizafahmi.com/img/negatif-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/negatif-300w.png&quot; alt=&quot;negatif&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;613&quot; srcset=&quot;https://rizafahmi.com/img/negatif-300w.png 300w, https://rizafahmi.com/img/negatif-600w.png 600w, https://rizafahmi.com/img/negatif-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Dan benar saja, ketika -1 diinput, yang terjadi adalah CPU langsung 100% dalam waktu yang cukup lama, bahkan terus menerus karena proses kalkulasi terus terjadi dan tidak dapat berhenti. Meski demikian, sistem tetap jalan, dan kita tetap bisa menggunakan aplikasi dan sistem tetap dapat digunakan seperti biasa.&lt;/p&gt;
&lt;p&gt;Masalah semakin rumit ketika tidak ada informasi apapun di catatan (&lt;em&gt;log&lt;/em&gt;) sistem. Seolah tidak terjadi apa-apa. Yang kita dapatkan adalah CPU 100% terus menerus.&lt;/p&gt;
&lt;h2&gt;Bug Fixing di &lt;em&gt;Production&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Mari sekarang kita telusuri dan mencari tahu apa yang terjadi. Ceritanya kita mendapatkan notifikasi bahwa sistem mencapai CPU 100% dalam waktu yang lama meski proses lainnya bekerja seperti biasa. Dapat dipastikan dari dasbor terlihat sepuluh ribu tugas yang kita instruksikan tetap berjalan dan memiliki tingkat kesuksesan nyaris 100%.&lt;/p&gt;
&lt;p&gt;Mari kita ssh ke server dan melihat apa yang terjadi. Ternyata tidak ada informasi apapun dari catatan sistem (&lt;em&gt;log&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/catatan-300w.webp 300w, https://rizafahmi.com/img/catatan-600w.webp 600w, https://rizafahmi.com/img/catatan-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/catatan-300w.png&quot; alt=&quot;catatan&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1032&quot; srcset=&quot;https://rizafahmi.com/img/catatan-300w.png 300w, https://rizafahmi.com/img/catatan-600w.png 600w, https://rizafahmi.com/img/catatan-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Berhubung hanya ada satu proses di level sistem operasi, kita tidak bisa membunuh proses tersebut di level sistem operasi dengan menggunakan manajemen tugas (&lt;em&gt;task manager&lt;/em&gt;) misalnya. Apabila hal ini kita lakukan, seluruh sistem akan berhenti. Untuk itu kita harus masuk kedalam sistem.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/taskmanager-300w.webp 300w, https://rizafahmi.com/img/taskmanager-600w.webp 600w, https://rizafahmi.com/img/taskmanager-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/taskmanager-300w.png&quot; alt=&quot;taskmanager&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;904&quot; srcset=&quot;https://rizafahmi.com/img/taskmanager-300w.png 300w, https://rizafahmi.com/img/taskmanager-600w.png 600w, https://rizafahmi.com/img/taskmanager-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Kita bisa melakukannya dengan perintah &lt;code&gt;_build/prod/rel/system/bin/system remote_console&lt;/code&gt; dari direktori aplikasi berada untuk masuk ke sesi IEx dengan konteks sistem yang sedang berjalan dan kita bisa melakukan investigasi disana. IEx adalah REPL Elixir dan dengan menggunakan perintah diatas, kita akan mendapatkan sesi IEx didalam sistem berjalan dan konteks sistem yang sedang berjalan sehingga kita bisa melakukan investigasi.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/iex-300w.webp 300w, https://rizafahmi.com/img/iex-600w.webp 600w, https://rizafahmi.com/img/iex-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/iex-300w.png&quot; alt=&quot;iex&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;210&quot; srcset=&quot;https://rizafahmi.com/img/iex-300w.png 300w, https://rizafahmi.com/img/iex-600w.png 600w, https://rizafahmi.com/img/iex-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Di sesi IEx kita bisa melakukan apapun yang biasa kita lakukan. Misalnya &lt;code&gt;1 + 2&lt;/code&gt;. Kita bisa melihat daftar proses yang sedang berjalan dengan fungsi &lt;code&gt;Process.list()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/process_list-300w.webp 300w, https://rizafahmi.com/img/process_list-600w.webp 600w, https://rizafahmi.com/img/process_list-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/process_list-300w.png&quot; alt=&quot;process_list&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;412&quot; srcset=&quot;https://rizafahmi.com/img/process_list-300w.png 300w, https://rizafahmi.com/img/process_list-600w.png 600w, https://rizafahmi.com/img/process_list-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Dan kita bisa mendapatkan informasi dari sebuah proses dengan fungsi &lt;code&gt;Process.info()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/process_info-300w.webp 300w, https://rizafahmi.com/img/process_info-600w.webp 600w, https://rizafahmi.com/img/process_info-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/process_info-300w.png&quot; alt=&quot;process info&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;838&quot; srcset=&quot;https://rizafahmi.com/img/process_info-300w.png 300w, https://rizafahmi.com/img/process_info-600w.png 600w, https://rizafahmi.com/img/process_info-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Dan kita bisa mendapatkan informasi proses mana yang membuat &lt;em&gt;CPU load&lt;/em&gt; yang tinggi dengan melakukan agregasi dari informasi yang didapat dari &lt;code&gt;Process.info()&lt;/code&gt;. Di sistem sudah disiapkan sebuah fungsi untuk agregasi dengan menjalankan &lt;code&gt;Runtime.top()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/top-300w.webp 300w, https://rizafahmi.com/img/top-600w.webp 600w, https://rizafahmi.com/img/top-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/top-300w.png&quot; alt=&quot;top&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1021&quot; srcset=&quot;https://rizafahmi.com/img/top-300w.png 300w, https://rizafahmi.com/img/top-600w.png 600w, https://rizafahmi.com/img/top-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Jalankan fungsi ini beberapa kali untuk memastikan id proses (PID) dengan CPU tertinggi adalah id proses yang sama. Dan kita sudah bisa menyimpulkan bahwa id proses yang bermasalah adalah &lt;code&gt;#PID&amp;lt;0.12507.0&amp;gt;&lt;/code&gt;. Kita simpan informasi id proses kedalam sebuah variable untuk mendapatkan informasi lebih rinci dengan &lt;code&gt;Process.info()&lt;/code&gt;. Dan kita bisa mendapatkan informasi seperti &lt;code&gt;current_stacktrace&lt;/code&gt;. Dan disana kita dapat melihat sistem menjalankan modul &lt;code&gt;ExampleSystem.Math&lt;/code&gt; dan fungsi &lt;code&gt;calc_sum&lt;/code&gt; dengan jumlah argumen 3 dengan kode sumber berada di &lt;code&gt;lib/example_system/math.ex&lt;/code&gt; dibaris ke-20.&lt;/p&gt;
&lt;p&gt;Dan kita bisa membunuh proses tersebut dengan fungsi &lt;code&gt;Process.kill()&lt;/code&gt; dan sistem kembali &lt;em&gt;cool down&lt;/em&gt;. Dan di sisi klien akhirnya setelah sekian lama, pesan kesalahan akhirnya muncul.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/dasbor-2-300w.webp 300w, https://rizafahmi.com/img/dasbor-2-600w.webp 600w, https://rizafahmi.com/img/dasbor-2-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/dasbor-2-300w.png&quot; alt=&quot;dasbor&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;601&quot; srcset=&quot;https://rizafahmi.com/img/dasbor-2-300w.png 300w, https://rizafahmi.com/img/dasbor-2-600w.png 600w, https://rizafahmi.com/img/dasbor-2-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/frontend-2-300w.webp 300w, https://rizafahmi.com/img/frontend-2-600w.webp 600w, https://rizafahmi.com/img/frontend-2-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/frontend-2-300w.png&quot; alt=&quot;frontend&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;665&quot; srcset=&quot;https://rizafahmi.com/img/frontend-2-300w.png 300w, https://rizafahmi.com/img/frontend-2-600w.png 600w, https://rizafahmi.com/img/frontend-2-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Setelah sistem mereda, langkah selanjutnya yang biasa kita lakukan adalah memperbaiki kesalahan tersebut. Kita sebelumnya sudah mendapatkan informasi bahwa terakhir kali dieksekusi adalah baris ke-20 dari file &lt;code&gt;lib/example_system/math.ex&lt;/code&gt;. Mari kita lihat kodenya.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;defp&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; calc_sum&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(n), do: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;calc_sum&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, n, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;defp&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; calc_sum&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(from, from, sum), do: sum + from&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;defp&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; calc_sum&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(from, to, acc_sum), do: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;calc_sum&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(from + &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, to, acc_sum + from)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dan fungsi &lt;code&gt;calc_sum&lt;/code&gt; ini dipanggil dari &lt;code&gt;lib/example_system_web/math/sum.ex&lt;/code&gt;. Dan benar saja, nilai negatif belum ditangani. Memperbaikinya cukup mudah, tinggal tambahkan satu kasus dimana input lebih kecil dari 0 dan kita nyatakan input yang tidak valid.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;defp start_sum(socket, str_input) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  operation =&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      case Integer.parse(str_input) do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      :error -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;          %{pid: nil, input: str_input, result: &quot;invalid input&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      {_input, remaining} when byte_size(remaining) &gt; 0 -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;          %{pid: nil, input: str_input, result: &quot;invalid input&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+     {input, &quot;&quot;} when input &amp;#x3C;= 0 -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+         %{pid: nil, input: input, result: &quot;invalid input&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      {input, &quot;&quot;} -&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;          do_start_sum(input)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;      end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  socket |&gt; update(:operations, &amp;#x26;[operation | &amp;#x26;1]) |&gt; assign(:data, data())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Namun jika diperhatikan , fungsi calc&lt;em&gt;sum kita juga terdapat beberapa kesalahan. Pertama, penanganan input 13 yang memang sengaja dibuat _error&lt;/em&gt;. Dan proses kalkulasinya kurang optimal. Dengan kekuatan &lt;em&gt;googling&lt;/em&gt; dan &lt;em&gt;stackoverflow&lt;/em&gt;, saya mendapatkan perhitungan yang lebih optimal.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-defp calc_sum(n), do: calc_sum(1, n, 0)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-defp calc_sum(from, from, sum), do: sum + from&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;-defp calc_sum(from, to, acc_sum), do: calc_sum(from + 1, to, acc_sum + from)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;+defp calc_sum(n), do: div(n * (n + 1), 2)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Setelah kesalahan diperbaiki, jalankan &lt;em&gt;test&lt;/em&gt; untuk memastikan bahwa semua sudah sesuai ekspektasi. Lalu, &lt;em&gt;moment of truth!&lt;/em&gt; Kita bisa melakukan peluncuran ulang (&lt;em&gt;deployment&lt;/em&gt;) dengan &lt;em&gt;zero downtime&lt;/em&gt; dengan perintah &lt;code&gt;mix system.upgrade&lt;/code&gt;! Ini terbukti dengan aplikasi dasbor yang tetap menyala.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/test-upgrade-300w.webp 300w, https://rizafahmi.com/img/test-upgrade-600w.webp 600w, https://rizafahmi.com/img/test-upgrade-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/test-upgrade-300w.png&quot; alt=&quot;test-upgrade&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;732&quot; srcset=&quot;https://rizafahmi.com/img/test-upgrade-300w.png 300w, https://rizafahmi.com/img/test-upgrade-600w.png 600w, https://rizafahmi.com/img/test-upgrade-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/dasbor-3-300w.webp 300w, https://rizafahmi.com/img/dasbor-3-600w.webp 600w, https://rizafahmi.com/img/dasbor-3-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/dasbor-3-300w.png&quot; alt=&quot;dasbor&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;617&quot; srcset=&quot;https://rizafahmi.com/img/dasbor-3-300w.png 300w, https://rizafahmi.com/img/dasbor-3-600w.png 600w, https://rizafahmi.com/img/dasbor-3-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Dan sekarang kita bisa mencoba kembali kesalahan-kesalahan yang tadi kita
lakukan bahkan tanpa menghentikan sistem secara keseluruhan. Dan karena
perhitungan sudah lebih optimal, perhitungan yang tadinya berjalan cukup lama,
sekarang sudah jauh lebih cepat tanpa memberatkan CPU sama sekali.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/final-300w.webp 300w, https://rizafahmi.com/img/final-600w.webp 600w, https://rizafahmi.com/img/final-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/final-300w.png&quot; alt=&quot;final&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;825&quot; srcset=&quot;https://rizafahmi.com/img/final-300w.png 300w, https://rizafahmi.com/img/final-600w.png 600w, https://rizafahmi.com/img/final-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/dasbor-4-300w.webp 300w, https://rizafahmi.com/img/dasbor-4-600w.webp 600w, https://rizafahmi.com/img/dasbor-4-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/dasbor-4-300w.png&quot; alt=&quot;dasbor&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;661&quot; srcset=&quot;https://rizafahmi.com/img/dasbor-4-300w.png 300w, https://rizafahmi.com/img/dasbor-4-600w.png 600w, https://rizafahmi.com/img/dasbor-4-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/giphy-300w.webp 300w, https://rizafahmi.com/img/giphy-400w.webp 400w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/giphy-300w.png&quot; alt=&quot;fixing bug in production&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;400&quot; height=&quot;307&quot; srcset=&quot;https://rizafahmi.com/img/giphy-300w.png 300w, https://rizafahmi.com/img/giphy-400w.png 400w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Catatan penting&lt;/strong&gt;: Jangan lakukan hal ini di sistem lain. Hanya di Elixir dan
bahasa-bahasa yang berjalan diatas BEAM yang bisa 😃. Hal ini juga dapat dibuktikan dengan Erlang yang digunakan di sistem telekomunikasi Ericsson yang ketika kode baru diluncurkan ketika kita sedang melakukan percakapan di telepon, telepon tidak terputus.&lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/BXmOlCy0oBM&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;hr /&gt;
&lt;p&gt;Kode dapat dilihat di https://github.com/rizafahmi/demo_system. Untuk belajar
lebih lanjut tentang Elixir dan BEAM silakan baca buku &lt;a href=&quot;https://medium.com/r/?url=https%3A%2F%2Fwww.manning.com%2Fbooks%2Felixir-in-action&quot;&gt; Elixir in Action
&lt;/a&gt;
karya Sasa Juric dan &lt;a href=&quot;https://medium.com/r/?url=https%3A%2F%2Fwww.manning.com%2Fbooks%2Fthe-little-elixir-and-otp-guidebook&quot;&gt; Little Elixir &amp;amp; OTP Guidebook
&lt;/a&gt;
karya Ben Tan Wei Hao.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/elixirinaction-300w.webp 300w, https://rizafahmi.com/img/elixirinaction-600w.webp 600w, https://rizafahmi.com/img/elixirinaction-945w.webp 945w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/elixirinaction-300w.png&quot; alt=&quot;elixir in action&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;945&quot; height=&quot;756&quot; srcset=&quot;https://rizafahmi.com/img/elixirinaction-300w.png 300w, https://rizafahmi.com/img/elixirinaction-600w.png 600w, https://rizafahmi.com/img/elixirinaction-945w.png 945w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/elixirotp-300w.webp 300w, https://rizafahmi.com/img/elixirotp-600w.webp 600w, https://rizafahmi.com/img/elixirotp-945w.webp 945w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/elixirotp-300w.png&quot; alt=&quot;elixir otp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;945&quot; height=&quot;756&quot; srcset=&quot;https://rizafahmi.com/img/elixirotp-300w.png 300w, https://rizafahmi.com/img/elixirotp-600w.png 600w, https://rizafahmi.com/img/elixirotp-945w.png 945w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Menjadi GDE dan Pengalaman Pertama Menghadiri Chrome Dev Summit</title>
    <link href="https://rizafahmi.com/2018/12/22/pengalaman-pertama-cds/"/>
    <updated>2018-12-22T00:00:00Z</updated>
    <pubDate>2018-12-22T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2018/12/22/pengalaman-pertama-cds/</id>
    <summary>Berikut cerita pengalaman pertama saya menghadiri Chrome Dev Summit 2018 atas undangan Google untuk para Google Developers Expert yang fokus di Web Technologies . Setelah sehari sebelumnya, di tanggal 10–11 November…</summary>
    <category term="catatan, komunitas, konferensi, rangkuman, web"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/cds.jpeg"/>
    <content type="html">&lt;p&gt;Berikut cerita pengalaman pertama saya menghadiri &lt;a href=&quot;https://developer.chrome.com/devsummit/&quot;&gt;Chrome Dev Summit 2018&lt;/a&gt; atas undangan Google untuk para &lt;a href=&quot;https://developers.google.com/experts/people/riza-fahmi.html&quot;&gt;Google Developers Expert&lt;/a&gt; yang fokus di &lt;a href=&quot;https://developers.google.com/experts/all/technology/web-technologies&quot;&gt;Web Technologies&lt;/a&gt;. Setelah sehari sebelumnya, di tanggal 10–11 November 2018 juga ada perhelatan akbar Developers Experts Summit dimana GDE atau &lt;a href=&quot;https://developers.google.com/experts/&quot;&gt;Google Developers Experts&lt;/a&gt; seluruh dunia berkumpul dan ber-&lt;em&gt;summit&lt;/em&gt;-ria.&lt;/p&gt;
&lt;p&gt;Sebelum mengulas acara yang diselenggarakan di &lt;a href=&quot;https://www.ybca.org/&quot;&gt;Yerba Buena Center for the Arts, San Francisco&lt;/a&gt; pada tanggal 12–13 November 2018 saya ingin menceritakan bagaimana saya bisa menjadi &lt;a href=&quot;https://developers.google.com/experts/&quot;&gt;Google Developers Experts&lt;/a&gt; terlebih dahulu agar konteksnya sesuai.&lt;/p&gt;
&lt;h2&gt;Menjadi Google Developers Experts&lt;/h2&gt;
&lt;p&gt;Suatu sore, saya &lt;em&gt;ngobrol&lt;/em&gt; dengan Mas &lt;a href=&quot;https://twitter.com/tyohan&quot;&gt;Yohan Totting&lt;/a&gt; dan dia ingin saya menjadi GDE, awalnya saya terkejut dan penasaran. Saya yakin masih banyak diluar sana orang yang lebih &lt;em&gt;expert&lt;/em&gt; dibanding saya. Karena penasaran, saya kemudian menanyakan apa itu GDE dan apa tugasnya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1__qVaoo5NzVm8UgujxqQfUg-300w.webp 300w, https://rizafahmi.com/img/1__qVaoo5NzVm8UgujxqQfUg-600w.webp 600w, https://rizafahmi.com/img/1__qVaoo5NzVm8UgujxqQfUg-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1__qVaoo5NzVm8UgujxqQfUg-300w.png&quot; alt=&quot;Yohan Totting — Developer Advocate, Web Developer Relations at Google&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;800&quot; srcset=&quot;https://rizafahmi.com/img/1__qVaoo5NzVm8UgujxqQfUg-300w.png 300w, https://rizafahmi.com/img/1__qVaoo5NzVm8UgujxqQfUg-600w.png 600w, https://rizafahmi.com/img/1__qVaoo5NzVm8UgujxqQfUg-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Yohan Totting — Developer Advocate, Web Developer Relations at Google&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Saya masih ingat banget jawaban Mas Yohan saat itu: “Lo lakukan apa yang selama ini sudah lo kerjakan. Tulis artikel, &lt;em&gt;screencast&lt;/em&gt;, &lt;em&gt;podcast&lt;/em&gt;, dan &lt;em&gt;talks&lt;/em&gt;.” Bedanya sekarang semua itu di &lt;em&gt;support&lt;/em&gt; Google. Jadi kalau saya diundang menjadi pembicara diluar Jakarta dan di sekitar Asia Tenggara, Google akan memberikan dukungan dalam bentuk tiket pesawat dan penginapan.&lt;/p&gt;
&lt;p&gt;Dalam hati, seru juga ya karena memang hal tersebut yang saya lakukan beberapa tahun terakhir dalam skala kecil. Singkat cerita, saya memberanikan diri untuk apply dengan &lt;em&gt;mindset nothing to lose&lt;/em&gt;. Banyak tahapan yang harus dilewati, mulai dari &lt;em&gt;screening&lt;/em&gt; awal, interview dengan GDE dan terakhir, kalau lulus, akan diinterview oleh &lt;em&gt;Googler&lt;/em&gt;! Lumayan kan, menambah pengalaman.&lt;/p&gt;
&lt;p&gt;Setelah melewati proses &lt;em&gt;screening&lt;/em&gt;, saya akhirnya dapat kesempatan diinterview oleh GDE. Saya anggap ini sebagai kesempatan saya meyakinkan diri apakah GDE pantas saya perjuangkan, karena praktis akan banyak waktu dan juga biaya yang akan keluar. Saya berkesempatan diinterview oleh &lt;a href=&quot;https://developers.google.com/experts/people/warat-wongmaneekit&quot;&gt;Warat Wongmaneekit&lt;/a&gt;, GDE asal Thailand.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_KGqjtipczDlZErawutzSSQ-300w.webp 300w, https://rizafahmi.com/img/1_KGqjtipczDlZErawutzSSQ-600w.webp 600w, https://rizafahmi.com/img/1_KGqjtipczDlZErawutzSSQ-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_KGqjtipczDlZErawutzSSQ-300w.png&quot; alt=&quot;Warat Wongmaneekit (kanan)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;600&quot; srcset=&quot;https://rizafahmi.com/img/1_KGqjtipczDlZErawutzSSQ-300w.png 300w, https://rizafahmi.com/img/1_KGqjtipczDlZErawutzSSQ-600w.png 600w, https://rizafahmi.com/img/1_KGqjtipczDlZErawutzSSQ-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Warat Wongmaneekit (kanan).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Di interview ini saya banyak ‘menjual’ konsep &lt;a href=&quot;https://randomscreencast.com/&quot;&gt;randomscreencast&lt;/a&gt;, &lt;em&gt;video screencast&lt;/em&gt; yang saya produksi. Saya menceritakan konsep &lt;em&gt;randomness&lt;/em&gt;, topik yang &lt;em&gt;random&lt;/em&gt;, dan di-&lt;em&gt;publish&lt;/em&gt; di tanggal dan jam yang &lt;em&gt;random&lt;/em&gt; pula. Kemudian saya juga banyak bercerita tentang beberapa komunitas yang saya inisiasi dan kelola, seperti &lt;a href=&quot;https://www.meetup.com/Meteor-Jakarta/&quot;&gt;Meteor Jakarta&lt;/a&gt;, &lt;a href=&quot;https://www.meetup.com/reactindonesia/&quot;&gt;React Indonesia&lt;/a&gt; dan &lt;a href=&quot;https://www.meetup.com/JakartaJS/&quot;&gt;JakartaJS&lt;/a&gt; tentunya.&lt;/p&gt;
&lt;p&gt;Dan ternyata saya lanjut! Meskipun ada beberapa pertanyaan teknis yang menurut saya jawabannya sulit dan juga pilihan spesialisasi juga cukup sulit. Saya diminta memilih spesialisasi di &lt;a href=&quot;https://developers.google.com/web/progressive-web-apps/&quot;&gt;Progressive Web Apps&lt;/a&gt;, &lt;a href=&quot;https://angular.io/&quot;&gt;Angular&lt;/a&gt; atau &lt;a href=&quot;https://www.webcomponents.org/&quot;&gt;Web Components&lt;/a&gt;/&lt;a href=&quot;https://www.polymer-project.org/&quot;&gt;Polymer&lt;/a&gt;. Dan saya akhirnya memilih &lt;a href=&quot;https://developers.google.com/web/progressive-web-apps/&quot;&gt;PWA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_qgBvAulWYDj_vsgONAMHYw-300w.webp 300w, https://rizafahmi.com/img/1_qgBvAulWYDj_vsgONAMHYw-600w.webp 600w, https://rizafahmi.com/img/1_qgBvAulWYDj_vsgONAMHYw-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_qgBvAulWYDj_vsgONAMHYw-300w.png&quot; alt=&quot;Jeff Posnick — Developer Platform Engineer at Google&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;661&quot; srcset=&quot;https://rizafahmi.com/img/1_qgBvAulWYDj_vsgONAMHYw-300w.png 300w, https://rizafahmi.com/img/1_qgBvAulWYDj_vsgONAMHYw-600w.png 600w, https://rizafahmi.com/img/1_qgBvAulWYDj_vsgONAMHYw-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Jeff Posnick — Developer Platform Engineer at Google&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Karena memilih &lt;a href=&quot;https://developers.google.com/web/progressive-web-apps/&quot;&gt;PWA&lt;/a&gt;, maka saya akan diinterview oleh &lt;em&gt;Googler&lt;/em&gt; yang berhubungan dengan PWA. Googler tersebut tak lain adalah yang bikin &lt;em&gt;library service worker&lt;/em&gt;, salah satu bagian penting dari PWA, &lt;a href=&quot;https://developers.google.com/web/tools/workbox/&quot;&gt;workbox&lt;/a&gt; nama &lt;em&gt;library&lt;/em&gt;-nya. Namanya &lt;a href=&quot;https://github.com/jeffposnick&quot;&gt;Jeff Posnick&lt;/a&gt;, yang adalah Developer Platform Engineer di Google.&lt;/p&gt;
&lt;p&gt;Singkat cerita, saya akhirnya menjadi &lt;a href=&quot;https://developers.google.com/experts/&quot;&gt;Google Developers Experts&lt;/a&gt; di Web Technologies fokusnya Progressive Web Apps. Tidak terbayang sebelumnya saya bisa berada di satu lingkaran dengan GDE lain seperti &lt;a href=&quot;https://developers.google.com/experts/people/shirley-wu.html&quot;&gt;Shirley Wu&lt;/a&gt; yang mengajarkan saya tentang &lt;a href=&quot;https://d3js.org/&quot;&gt;D3js&lt;/a&gt; melalui &lt;em&gt;video course&lt;/em&gt;, &lt;a href=&quot;https://developers.google.com/experts/people/kent-c-dodds.html&quot;&gt;Kent C. Dodds&lt;/a&gt; yang mengajarkan saya &lt;a href=&quot;https://reactjs.org/&quot;&gt;React&lt;/a&gt; dan &lt;a href=&quot;https://jestjs.io/&quot;&gt;testing&lt;/a&gt;, &lt;a href=&quot;https://developers.google.com/experts/people/ryan-chenkie.html&quot;&gt;Ryan Chenkie&lt;/a&gt; yang mengajarkan saya &lt;a href=&quot;https://graphql.org/&quot;&gt;GraphQL&lt;/a&gt; melalui &lt;em&gt;video course&lt;/em&gt; dan experts lainnya diseluruh dunia!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_kq0fNkin8vBfmenP7PDMlg-300w.webp 300w, https://rizafahmi.com/img/1_kq0fNkin8vBfmenP7PDMlg-600w.webp 600w, https://rizafahmi.com/img/1_kq0fNkin8vBfmenP7PDMlg-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_kq0fNkin8vBfmenP7PDMlg-300w.png&quot; alt=&quot;Berada satu lingkaran dengan para experts&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;339&quot; srcset=&quot;https://rizafahmi.com/img/1_kq0fNkin8vBfmenP7PDMlg-300w.png 300w, https://rizafahmi.com/img/1_kq0fNkin8vBfmenP7PDMlg-600w.png 600w, https://rizafahmi.com/img/1_kq0fNkin8vBfmenP7PDMlg-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Berada satu lingkaran dengan para experts.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ketika apa yang saya produksi selama ini diakui oleh seorang Web Developer Relations sekelas Mas &lt;a href=&quot;https://twitter.com/tyohan&quot;&gt;Yohan&lt;/a&gt; dan diapresiasi oleh Google kebahagiaan yang hakiki buat saya. Jadi buat teman-teman yang ingin mengundang saya untuk berbagi silakan kontak saya, transportasi dan akomodasi akan ditanggung oleh Google (&lt;em&gt;syarat dan ketentuan berlaku&lt;/em&gt;).&lt;/p&gt;
&lt;h2&gt;Tentang Acara Chrome Dev Summit&lt;/h2&gt;
&lt;p&gt;Sehari sebelum acara Chrome Dev Summit, saya bertemu dengan Mas &lt;a href=&quot;https://twitter.com/AriyaHidayat&quot;&gt;Ariya Hidayat&lt;/a&gt; yang memang domisili di &lt;a href=&quot;https://en.wikipedia.org/wiki/San_Jose,_California&quot;&gt;San Jose&lt;/a&gt;, dekat dengan lokasi hotel dan &lt;em&gt;venue&lt;/em&gt; Experts Summit. Dan saya diberi bocoran bahwa &lt;a href=&quot;https://developer.chrome.com/devsummit/&quot;&gt;Chrome Dev Summit&lt;/a&gt; itu serunya adalah bagian &lt;em&gt;networking&lt;/em&gt;-nya karena untuk sesi talks-nya dapat dinikmati secara live-streaming via &lt;a href=&quot;https://www.youtube.com/playlist?list=PLNYkxOF6rcIDjlCx1PcphPpmf43aKOAdF&quot;&gt;youtube&lt;/a&gt;. Dan itulah yang saya lakukan!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_BXXlQnFRaDaDDhW3q9lRoQ-300w.webp 300w, https://rizafahmi.com/img/1_BXXlQnFRaDaDDhW3q9lRoQ-600w.webp 600w, https://rizafahmi.com/img/1_BXXlQnFRaDaDDhW3q9lRoQ-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_BXXlQnFRaDaDDhW3q9lRoQ-300w.png&quot; alt=&quot;Bersama sang Legenda, Ariya Hidayat&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_BXXlQnFRaDaDDhW3q9lRoQ-300w.png 300w, https://rizafahmi.com/img/1_BXXlQnFRaDaDDhW3q9lRoQ-600w.png 600w, https://rizafahmi.com/img/1_BXXlQnFRaDaDDhW3q9lRoQ-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Bersama sang Legenda, Ariya Hidayat&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Pastinya banyak developer kelas dunia &lt;em&gt;berseliweran&lt;/em&gt; disana, sebagian besar karyawan Google sih, beberapa idola saya. Jadi sekalian berburu &lt;em&gt;selfie&lt;/em&gt; atau sekedar &lt;em&gt;say hi&lt;/em&gt;. Setelah nonton beberapa sesi, terutama sesi yang dibawakan oleh pak &lt;a href=&quot;https://twitter.com/paul_irish&quot;&gt;Paul Irish&lt;/a&gt; tentang performa dan tools &lt;a href=&quot;https://developers.google.com/web/tools/lighthouse/&quot;&gt;lighthouse&lt;/a&gt;.. eh, ternyata pak Paul malah nongkrong jaga stand &lt;em&gt;lighthouse&lt;/em&gt;. Ngga kebayang sih, orang sepenting beliau masih sempat ikutan jaga stand. Ya mumpung beliau idola saya sejak &lt;a href=&quot;https://html5boilerplate.com/&quot;&gt;HTML5 Boilerplate&lt;/a&gt;, &lt;em&gt;say hi&lt;/em&gt; dan foto bareng tentunya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_UQAwr3lgW6hg7GzcRf2E8g-300w.webp 300w, https://rizafahmi.com/img/1_UQAwr3lgW6hg7GzcRf2E8g-600w.webp 600w, https://rizafahmi.com/img/1_UQAwr3lgW6hg7GzcRf2E8g-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_UQAwr3lgW6hg7GzcRf2E8g-300w.png&quot; alt=&quot;Paul Irish — Performance Engineer at Google&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1599&quot; srcset=&quot;https://rizafahmi.com/img/1_UQAwr3lgW6hg7GzcRf2E8g-300w.png 300w, https://rizafahmi.com/img/1_UQAwr3lgW6hg7GzcRf2E8g-600w.png 600w, https://rizafahmi.com/img/1_UQAwr3lgW6hg7GzcRf2E8g-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;strong&gt;Paul Irish — Performance Engineer at Google&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Saat dulu diminta untuk membawakan materi tentang Progressive Web Apps di TechInAsia Product Development Conference 2017 saya banyak belajar topik tersebut dari &lt;a href=&quot;https://www.udacity.com/course/intro-to-progressive-web-apps--ud811&quot;&gt;online course ini&lt;/a&gt;. Instrukturnya Pete LePage yang sangat, sangat lucu dan membawakan materi dengan menarik. Jauh dari kata &lt;em&gt;boring&lt;/em&gt;. Saya yakin beberapa teman-teman di Indonesia pernah bertemu atau melihat bapak Pete ini karena beliau pernah datang ke Indonesia untuk mengisi materi workshop PWA. Di hari kedua CDS sekilas saya melihat sosok tersebut. Awalnya saya lupa namanya sampai harus &lt;em&gt;googling&lt;/em&gt; dulu supaya ingat namanya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_2w2llYk5fok7ylcU5zaUBQ-300w.webp 300w, https://rizafahmi.com/img/1_2w2llYk5fok7ylcU5zaUBQ-600w.webp 600w, https://rizafahmi.com/img/1_2w2llYk5fok7ylcU5zaUBQ-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_2w2llYk5fok7ylcU5zaUBQ-300w.png&quot; alt=&quot;Pete LePage — Dev Advocate at google&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_2w2llYk5fok7ylcU5zaUBQ-300w.png 300w, https://rizafahmi.com/img/1_2w2llYk5fok7ylcU5zaUBQ-600w.png 600w, https://rizafahmi.com/img/1_2w2llYk5fok7ylcU5zaUBQ-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;*Pete LePage — *Dev Advocate at google**&lt;/p&gt;
&lt;p&gt;Akhirnya saya berhasil mencegat dia, ngobrol dan foto bareng tentunya. Berterimakasih karena dia yang mengajarkan saya PWA pertama kali dan dari hal tersebut akhirnya membawa saya menjadi GDE. Tak lupa saya tanya rahasia gimana bisa &lt;em&gt;seluwes&lt;/em&gt; itu didepan kamera. Saya pernah berada didepan kamera dan sumpah, susah banget membawakan materi dengan lancar dan luwes ketika berhadapan dengan kamera. Sederhananya, ngga ada rahasia karena &lt;em&gt;he’s a natural&lt;/em&gt;. Memang aslinya dia lucu aja. Berikut cuplikan video Pak Pete buat yang penasaran.&lt;/p&gt;
&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/_dXBibRO0SM&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;p&gt;Kemudian tentu, saya bertemu dengan Jeff Posnick yang menginterview saya dan meloloskan saya menjadi GDE. Menariknya, saya sempat bertemu pak Jeff ini dihari pertama, tapi saya ngga *ngeh *kalo itu dia. Beda banget tampilannya di video call dengan aslinya, jadi pangling saya. Ketika ngobrol dengan Mas Yohan saya bilang pengen ketemu pak Jeff, dia kaget. “Lah, yang kemaren sebelah gue itu Jeff.”&lt;/p&gt;
&lt;p&gt;Akhirnya di hari kedua saya cari dia dan akhirnya ketemu. Pas ketemu saya nge-&lt;em&gt;blank&lt;/em&gt; sampe lupa namanya: &lt;em&gt;“Hey man, my name is Riza. I’m totally blank right now and suddenly forgot your name.&lt;/em&gt;” Untungnya dia dengan baik hati membalas: &lt;em&gt;“My name is Jeff, nice to meet you!”&lt;/em&gt; Setelah itu percakapan berjalan cukup lancar. Tak lupa saya ucapkan terimakasih karena telah menerima saya menjadi GDE dan tak lupa &lt;em&gt;selfie&lt;/em&gt;!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_8dKYVqXD9qpBVHiI91e2mg-300w.webp 300w, https://rizafahmi.com/img/1_8dKYVqXD9qpBVHiI91e2mg-600w.webp 600w, https://rizafahmi.com/img/1_8dKYVqXD9qpBVHiI91e2mg-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_8dKYVqXD9qpBVHiI91e2mg-300w.png&quot; alt=&quot;Akhirnya bisa bertemu Pak Jeff secara langsung&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1599&quot; srcset=&quot;https://rizafahmi.com/img/1_8dKYVqXD9qpBVHiI91e2mg-300w.png 300w, https://rizafahmi.com/img/1_8dKYVqXD9qpBVHiI91e2mg-600w.png 600w, https://rizafahmi.com/img/1_8dKYVqXD9qpBVHiI91e2mg-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Akhirnya bisa bertemu Pak Jeff secara langsung&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Lalu secara tidak sengaja saya berpapasan dengan seseorang dengan tshirt yang menarik perhatian saya. Tulisannya momentum beserta logonya. Oh, saya tahu &lt;a href=&quot;https://momentumdash.com/&quot;&gt;momentum&lt;/a&gt;, sebuah &lt;a href=&quot;https://momentumdash.com/&quot;&gt;chrome extension&lt;/a&gt; yang menampilkan foto-foto indah ketika kita buka tab baru. Tentu setelah itu fiturnya bertambah sebagai salah satu &lt;em&gt;productivity tools&lt;/em&gt; dengan penambahan todo list dan lain sebagainya.&lt;/p&gt;
&lt;p&gt;Ketika berpapasan, saya cuma &lt;em&gt;nyeletuk&lt;/em&gt;: &lt;em&gt;“Nice shirt!”.&lt;/em&gt; Gayung bersambut, dia lantas bertanya: &lt;em&gt;“You knew momentum?!”&lt;/em&gt; dan pembicaraan berlanjut. Dia minta kontak linkedin saya (entah buat apa), dan menawarkan apakah saya mau stiker. Tentu saja saya terima dengan tangan terbuka 🤗&lt;/p&gt;
&lt;p&gt;Tidak lupa saya bertanya tentang strategi monetisasi dari momentum. Saya tidak bisa membayangkan bagaimana mereka bisa menemukan cara untuk monetisasi dari sebuah produk sederhana seperti momentum ini. Ternyata mereka benar-benar ingin menjadi sebuah produk yang membantu orang untuk fokus dan produktif. Mereka menyasar &lt;em&gt;corporate&lt;/em&gt; untuk memberikan &lt;em&gt;best practic&lt;/em&gt;e dan &lt;em&gt;tools berbayar&lt;/em&gt; dalam rangkan meningkatkan produktifitas karyawannya. Keren juga ya…&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_-PLXV7dY7mr189OsfH2cZQ-300w.webp 300w, https://rizafahmi.com/img/1_-PLXV7dY7mr189OsfH2cZQ-600w.webp 600w, https://rizafahmi.com/img/1_-PLXV7dY7mr189OsfH2cZQ-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_-PLXV7dY7mr189OsfH2cZQ-300w.png&quot; alt=&quot;Jason Waterman — Co-founder, CTO Momentum&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1599&quot; srcset=&quot;https://rizafahmi.com/img/1_-PLXV7dY7mr189OsfH2cZQ-300w.png 300w, https://rizafahmi.com/img/1_-PLXV7dY7mr189OsfH2cZQ-600w.png 600w, https://rizafahmi.com/img/1_-PLXV7dY7mr189OsfH2cZQ-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;strong&gt;Jason Waterman — Co-founder, CTO Momentum&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lalu di hari kedua atau hari terakhir, malam harinya saya diundang oleh tim Chrome untuk penataran tambahan. Tidak semua orang diundang ternyata. Selain dapat makan malam, saya bisa bertemu developer heroes seperti pak &lt;a href=&quot;https://www.linkedin.com/in/bgalbs/&quot;&gt;Ben Galbraith&lt;/a&gt;, pak &lt;a href=&quot;https://www.linkedin.com/in/dalmaer/&quot;&gt;Dion Almaer&lt;/a&gt;, ibu &lt;a href=&quot;https://www.linkedin.com/in/egsweeny/&quot;&gt;Elizabeth Sweeny&lt;/a&gt;, bang &lt;a href=&quot;https://addyosmani.com/&quot;&gt;Addy Osmani&lt;/a&gt; dan om &lt;a href=&quot;https://twitter.com/slightlylate&quot;&gt;Alex Russell&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Saya dan om Alex ngobrol cukup banyak tentang PWA dan betapa &lt;em&gt;bloated&lt;/em&gt;-nya framework-framework JavaScript yang ada sekarang. Ternyata om yang satu ini cukup &lt;em&gt;old school&lt;/em&gt; yang lebih memilih menulis kode dengan vanilla JavaScript saja. Saya ingat banget dia bilang gini: “Once you initialize new project with create-react-app, it’s already bloated!” Benar juga ya, &lt;em&gt;point taken&lt;/em&gt;! Itu bahkan belum kita apa-apain, belum install *redux, routes *dan library lainnya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_hAn3urFSLoRJGLGRGk6L3A-300w.webp 300w, https://rizafahmi.com/img/1_hAn3urFSLoRJGLGRGk6L3A-600w.webp 600w, https://rizafahmi.com/img/1_hAn3urFSLoRJGLGRGk6L3A-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_hAn3urFSLoRJGLGRGk6L3A-300w.png&quot; alt=&quot;Alex Russell — Senior Engineer at Google&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1599&quot; srcset=&quot;https://rizafahmi.com/img/1_hAn3urFSLoRJGLGRGk6L3A-300w.png 300w, https://rizafahmi.com/img/1_hAn3urFSLoRJGLGRGk6L3A-600w.png 600w, https://rizafahmi.com/img/1_hAn3urFSLoRJGLGRGk6L3A-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Alex Russell — Senior Engineer at Google&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Oh iya, buat yang belum kenal dengan om Alex Russell, dia adalah Senior Engineer yang mengerjakan &lt;a href=&quot;http://www.chromium.org/blink&quot;&gt;Blink&lt;/a&gt; engine Chrome, &lt;a href=&quot;http://dojotoolkit.org/&quot;&gt;dojo&lt;/a&gt;, App Cache, Service Worker, &lt;a href=&quot;https://www.webcomponents.org/community/author/alex_russell&quot;&gt;web component&lt;/a&gt;, anggota &lt;a href=&quot;http://www.ecma-international.org/memento/TC39.htm&quot;&gt;ECMA TC39&lt;/a&gt;, anggota &lt;a href=&quot;http://www.w3.org/2001/tag/&quot;&gt;W3C Technical Architecture Group&lt;/a&gt; dan masih banyak lagi. Sangking serunya percakapan kami, acara selesai dan saya tidak sempat &lt;em&gt;say hi&lt;/em&gt; dengan Addy Osmani, &lt;em&gt;damn&lt;/em&gt;! &lt;em&gt;Maybe next time&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Tentang Sesi Chrome Dev Summit&lt;/h2&gt;
&lt;p&gt;Meskipun sesi &lt;em&gt;networking&lt;/em&gt; adalah sesi yang paling seru, bukan artinya sesi talks tidak seru. Banyak sekali pelajaran penting yang saya dapatkan. Mulai dari melihat bagaimana panitia menciptakan alur cerita dan kondisi agar penonton tetap &lt;em&gt;engage&lt;/em&gt; dan terhibur, topik, cara presentasi, hingga &lt;a href=&quot;https://youtu.be/nKtQHxfRVAM?t=20576&quot;&gt;kegagalan pembicara kala membawakan sesi* live code&lt;/a&gt;* dan bagaimana mereka mengatasinya. Meskipun tidak semua sesi dapat saya tonton karena ramai dan beberapa kali tidak kebagian tempat. Dilain kesempatan saya dapat tempat dan secara spontan tertidur dan terbangun ketika sesi berakhir. Apalagi semua &lt;a href=&quot;https://bit.ly/CDS18-AllSessions&quot;&gt;video tersedia di youtube&lt;/a&gt;, jadi saya bisa nonton video-video menarik setelah pulang saja. Berikut beberapa hal yang menarik perhatian saya.&lt;/p&gt;
&lt;h3&gt;Keynote Hari Pertama&lt;/h3&gt;
&lt;p&gt;Tahun 2018 ternyata merupakan ulang tahun &lt;a href=&quot;https://www.google.com/chrome/&quot;&gt;Google Chrome&lt;/a&gt; yang ke-10. Tidak hanya itu saja, &lt;a href=&quot;https://www.android.com/&quot;&gt;Android&lt;/a&gt; pun berulangtahun yang ke-10 di tahun ini. Begitupula dengan &lt;a href=&quot;https://v8.dev/&quot;&gt;V8&lt;/a&gt;, &lt;em&gt;engine&lt;/em&gt; JavaScript yang digunakan Chrome, umurnya juga 10 tahun. Lebih jauh, di tahun 2018 ini &lt;a href=&quot;https://google.com/&quot;&gt;Google&lt;/a&gt; sudah berumur 20 tahun saja!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_Sa4zAFsROJdtnioMJROM3Q-300w.webp 300w, https://rizafahmi.com/img/1_Sa4zAFsROJdtnioMJROM3Q-600w.webp 600w, https://rizafahmi.com/img/1_Sa4zAFsROJdtnioMJROM3Q-924w.webp 924w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_Sa4zAFsROJdtnioMJROM3Q-300w.png&quot; alt=&quot;Peningkatan Fitur Modern JavaScript di V8&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;924&quot; height=&quot;476&quot; srcset=&quot;https://rizafahmi.com/img/1_Sa4zAFsROJdtnioMJROM3Q-300w.png 300w, https://rizafahmi.com/img/1_Sa4zAFsROJdtnioMJROM3Q-600w.png 600w, https://rizafahmi.com/img/1_Sa4zAFsROJdtnioMJROM3Q-924w.png 924w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Peningkatan Fitur Modern JavaScript di V8&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://v8.dev/&quot;&gt;V8&lt;/a&gt; sudah banyak sekali melakukan optimisasi. Teraktual, mereka berhasil meningkatkan kinerja &lt;em&gt;garbage collector&lt;/em&gt; menjadi lebih cepat 100 kali lipat! Kemudian mereka juga mengoptimalkan beberapa fitur JavaScript modern seperti promise, async/await, array destructuring dan masih banyak optimisasi lainnya. Dan V8 sekarang sudah mendukung &lt;a href=&quot;https://webassembly.org/&quot;&gt;webassembly&lt;/a&gt;. Tentang &lt;a href=&quot;https://webassembly.org/&quot;&gt;webassembly&lt;/a&gt; akan kita bahas di bagian tersendiri nanti.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/@addyosmani/the-cost-of-javascript-in-2018-7d8950fbb5d4&quot;&gt;Performance bugdet&lt;/a&gt; juga merupakan salah satu topik yang sangat sering muncul di berbagai sesi dan secara umum tema dari Summit kali ini memang didominasi oleh topik seputar performa.&lt;/p&gt;
&lt;p&gt;Kemudian hadir pembicaraan tentang &lt;a href=&quot;https://developers.google.com/web/fundamentals/primers/service-workers/&quot;&gt;Service Worker&lt;/a&gt; dan juga &lt;a href=&quot;https://developers.google.com/web/progressive-web-apps/&quot;&gt;Porgressive Web Apps&lt;/a&gt;. Jika teman-teman tertarik untuk belajar Service Worker dengan cara yang menyenangkan, bisa main game &lt;a href=&quot;https://serviceworkies.com/&quot;&gt;serviceworkies.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Untuk lebih detailnya, bisa cek video keynote hari pertama berikut.&lt;/p&gt;
&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/zPHyxvPT0gg&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;h3&gt;Keynote Hari Kedua&lt;/h3&gt;
&lt;p&gt;Hari berikutnya cukup menarik terutama keynote hari kedua. Hal yang cukup menggelitik adalah ketika mbak &lt;a href=&quot;https://www.linkedin.com/in/nicolesullivan&quot;&gt;Nicole Sullivan&lt;/a&gt; mengatakan bahwa &lt;em&gt;framework&lt;/em&gt; terkadang membuat aplikasi kita lambat. Tapi &lt;em&gt;framework&lt;/em&gt; juga harapan utama kita untuk membuat aplikasi kita menjadi lebih cepat. Karena itu duet mbak &lt;a href=&quot;https://www.linkedin.com/in/nicolesullivan&quot;&gt;Nicole&lt;/a&gt; dan juga mas &lt;a href=&quot;https://twitter.com/cramforce&quot;&gt;Malte Ubl&lt;/a&gt; menggarisbawahi beberapa perubahan yang dilakukan &lt;em&gt;framework-framework&lt;/em&gt; untuk membuat performa aplikasi menjadi lebih optimal.&lt;/p&gt;
&lt;p&gt;Pertama ada &lt;a href=&quot;https://reactjs.org/&quot;&gt;React&lt;/a&gt; yang sudah menerapkan &lt;em&gt;code splitting&lt;/em&gt; dan melakukan proses render lebih optimal dengan memecahnya menjadi bagian kecil. Kemudian React juga memperkenalkan &lt;em&gt;lazy mode&lt;/em&gt;, &lt;em&gt;suspense&lt;/em&gt; dan juga konkurensi.&lt;/p&gt;
&lt;p&gt;Selanjutnya ada Angular yang memasukkan performance budget kedalam &lt;a href=&quot;https://cli.angular.io/&quot;&gt;angular-cli&lt;/a&gt;, beberapa &lt;em&gt;polyfill&lt;/em&gt; dibuang dan memperkenalkan &lt;a href=&quot;https://blog.angularindepth.com/inside-ivy-exploring-the-new-angular-compiler-ebf85141cee1?gi=e853685fe5a4&quot;&gt;Ivy&lt;/a&gt;, sebuah kompiler baru untuk membuat Angular view menjadi lebih cepat.&lt;/p&gt;
&lt;p&gt;Framework berikutnya, &lt;a href=&quot;https://vuejs.org/&quot;&gt;Vue&lt;/a&gt; yang memperkenalkan &lt;em&gt;modern mode&lt;/em&gt; untuk men-&lt;em&gt;deliver&lt;/em&gt; aplikasi web kita ke modern browser saja. Hal ini dapat menghapus beberapa &lt;em&gt;polyfill&lt;/em&gt; yang digunakan dalam rangka mengakomodasi browser &lt;em&gt;jadul&lt;/em&gt;. Vue juga telah melakukan &lt;em&gt;preloading&lt;/em&gt; dan &lt;em&gt;prefetching&lt;/em&gt; secara default.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.polymer-project.org/&quot;&gt;Polymer&lt;/a&gt;, akan bertransformasi menjadi &lt;a href=&quot;https://lit-element.polymer-project.org/&quot;&gt;lit-element&lt;/a&gt; dalam rangka menerapkan web component yang sangat &lt;em&gt;slim&lt;/em&gt;. Dan, kabar gembiranya, &lt;em&gt;web component&lt;/em&gt; sekarang sudah didukung secara &lt;em&gt;native&lt;/em&gt; di firefox!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.webcomponents.org/&quot;&gt;Kompatibilitas Web Components. Dikutip dari https://www.webcomponents.org/&lt;/a&gt;](/assets/images/cds/1_YFeztoPNMcKP-Q808mgZQg.png)&lt;em&gt;Kompatibilitas Web Components. Dikutip dari &lt;a href=&quot;https://www.webcomponents.org/&quot;&gt;https://www.webcomponents.org/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/0_otRMcCbm0f6_rNdY-300w.webp 300w, https://rizafahmi.com/img/0_otRMcCbm0f6_rNdY-400w.webp 400w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/0_otRMcCbm0f6_rNdY-300w.png&quot; alt=&quot;Svelte&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;400&quot; height=&quot;400&quot; srcset=&quot;https://rizafahmi.com/img/0_otRMcCbm0f6_rNdY-300w.png 300w, https://rizafahmi.com/img/0_otRMcCbm0f6_rNdY-400w.png 400w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://svelte.technology/&quot;&gt;Svelte&lt;/a&gt;, sebuah &lt;a href=&quot;https://svelte.technology/blog/frameworks-without-the-framework&quot;&gt;framework tanpa framework&lt;/a&gt;, sebuah konsep yang sangat menarik buat saya pribadi. Disini Svelte di-&lt;em&gt;highlight&lt;/em&gt; sebagai sebuah framework yang pada dasarnya sudah sangat cepat, tanpa harus ada optimisasi lebih lanjut. Sederhananya, kita men-&lt;em&gt;develop&lt;/em&gt; aplikasi web dengan &lt;em&gt;framework&lt;/em&gt; Svelte, mungkin ditambah beberapa &lt;em&gt;library&lt;/em&gt; seperti &lt;em&gt;state management&lt;/em&gt;, &lt;em&gt;routes&lt;/em&gt;, dan lain sebagainya. Yang menarik, kemudian kita melakukan kompilasi dengan &lt;em&gt;tools&lt;/em&gt; yang disediakan sehingga hasil akhirnya berupa html, css dan &lt;strong&gt;vanilla JavaScript&lt;/strong&gt; yang bisa berjalan bahkan di browser yang tidak terlalu modern. Dan ukuran yang dihasilkan sangat kecil dan optimal!&lt;/p&gt;
&lt;p&gt;Terakhir &lt;a href=&quot;https://www.emberjs.com/&quot;&gt;Ember&lt;/a&gt;, yang menghapus &lt;a href=&quot;https://jquery.com/&quot;&gt;jQuery&lt;/a&gt; dari *boilerplate default-*nya. Meskipun bisa ditambahkan jika perlu. Dengan menghapus jQuery, Ember mampu mengurangi ukurannya sebanyak 20% saja! Selain menghapus jQuery, Ember juga melakukan optimasi di bagian &lt;em&gt;rendering&lt;/em&gt;-nya.&lt;/p&gt;
&lt;p&gt;Untuk lebih lengkapnya, berikut video keynote hari kedua.&lt;/p&gt;
&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/SbUAkQ_s7Os&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;h3&gt;Actor Model Untuk Web&lt;/h3&gt;
&lt;p&gt;Actor model adalah sebuah konsep yang berkembang dikalangan komputasi konkurensi yang muncul pertama kali ditahun 1973. Actor model yang paling terkenal diterapkan di bahasa pemrograman &lt;a href=&quot;https://www.erlang.org/&quot;&gt;Erlang&lt;/a&gt;, dan kemudian dilanjutkan oleh &lt;a href=&quot;https://elixir-lang.org/&quot;&gt;Elixir&lt;/a&gt;. Kita juga dapat menerapkan konsep ini di bahasa seperti &lt;a href=&quot;https://medium.com/pujanggateknologi/berkenalan-dengan-scala-dd6452596fa6&quot;&gt;scala&lt;/a&gt; dengan memanfaatkan framework seperti &lt;a href=&quot;https://akka.io/&quot;&gt;Akka&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ternyata di web &lt;em&gt;actor model&lt;/em&gt; ini juga cocok diterapkan di web. Mas &lt;a href=&quot;https://twitter.com/dassurma&quot;&gt;Surma&lt;/a&gt; dan mas &lt;a href=&quot;https://twitter.com/aerotwist&quot;&gt;Paul Lewis&lt;/a&gt; dalam sesi yang diberi judul “*Architecting Web Apps — lights, camera, action!” *mendemokan &lt;em&gt;actor model&lt;/em&gt; yang diterapkan disisi web. Misalnya sebuah aplikasi web mempunyai &lt;em&gt;actor&lt;/em&gt;: UI, state, storage dan juga broadcaster. Cukup familiar kan dengan konsep seperti ini? Kalau dipikir-pikir ada sedikit kemiripan dengan Redux. &lt;em&gt;Well&lt;/em&gt;, teman-teman bisa cek langsung &lt;a href=&quot;https://github.com/PolymerLabs/actor-boilerplate&quot;&gt;reponya disini&lt;/a&gt;.&lt;/p&gt;
&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/Vg60lf92EkM&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;h3&gt;Houdini CSS&lt;/h3&gt;
&lt;p&gt;Sesi berikutnya yang menurut saya menarik adalah tentang &lt;a href=&quot;https://wiki.mozilla.org/CSS/Houdini&quot;&gt;Houdini&lt;/a&gt;. Houdini adalah sebuah inisiasi yang isinya sekelompok orang yang ditunjuk oleh konsorsium &lt;a href=&quot;https://www.w3.org/&quot;&gt;w3c&lt;/a&gt; untuk mengembangkan CSS berikutnya. Mereka menciptakan &lt;em&gt;tools&lt;/em&gt; untuk membuat fitur-fitur CSS baru yang saat ini belum diterapkan browser.&lt;/p&gt;
&lt;p&gt;Secara sederhana, Houdini adalah &lt;em&gt;low-level API&lt;/em&gt; JavaScript untuk kebutuhan rendering. Artinya kita bisa mengajari HTML untuk me-&lt;em&gt;render&lt;/em&gt; sesuatu yang belum bisa dilakukan oleh CSS. Memang untuk saat ini belum semua API dan browser mendukung Houdini, tapi kita sudah bisa menggunakan paint API-nya di &lt;a href=&quot;https://ishoudinireadyyet.com/&quot;&gt;Chrome dan Opera&lt;/a&gt;, paling tidak.&lt;/p&gt;
&lt;p&gt;Contohnya ketika kita ingin membuat lingkaran sebagai background dari textarea, kita bisa ‘mengajari’ browser untuk melakukannya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_vmHK2v4dEvQKrZG5xyJoww-300w.webp 300w, https://rizafahmi.com/img/1_vmHK2v4dEvQKrZG5xyJoww-600w.webp 600w, https://rizafahmi.com/img/1_vmHK2v4dEvQKrZG5xyJoww-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_vmHK2v4dEvQKrZG5xyJoww-300w.png&quot; alt=&quot;Contoh mengajari browser menggambar lingkaran di textarea.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;793&quot; srcset=&quot;https://rizafahmi.com/img/1_vmHK2v4dEvQKrZG5xyJoww-300w.png 300w, https://rizafahmi.com/img/1_vmHK2v4dEvQKrZG5xyJoww-600w.png 600w, https://rizafahmi.com/img/1_vmHK2v4dEvQKrZG5xyJoww-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Contoh mengajari browser menggambar lingkaran di textarea.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Kemudian kita definisikan bagaimana cara membuat lingkaran di &lt;code&gt;circle.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_6wRx6hybqgUlgQ2EoyufvA-300w.webp 300w, https://rizafahmi.com/img/1_6wRx6hybqgUlgQ2EoyufvA-600w.webp 600w, https://rizafahmi.com/img/1_6wRx6hybqgUlgQ2EoyufvA-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_6wRx6hybqgUlgQ2EoyufvA-300w.png&quot; alt=&quot;Contoh menggambar lingkaran denga JavaScript&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;478&quot; srcset=&quot;https://rizafahmi.com/img/1_6wRx6hybqgUlgQ2EoyufvA-300w.png 300w, https://rizafahmi.com/img/1_6wRx6hybqgUlgQ2EoyufvA-600w.png 600w, https://rizafahmi.com/img/1_6wRx6hybqgUlgQ2EoyufvA-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Contoh menggambar lingkaran denga JavaScript&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nah, sekarang kita bisa menggunakan &lt;em&gt;circle&lt;/em&gt; tadi di file CSS dengan &lt;code&gt;paint&lt;/code&gt; API yang sudah tersedia di beberapa browser modern.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_8EH9hEb7wYfjuwCrXdndxQ-300w.webp 300w, https://rizafahmi.com/img/1_8EH9hEb7wYfjuwCrXdndxQ-600w.webp 600w, https://rizafahmi.com/img/1_8EH9hEb7wYfjuwCrXdndxQ-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_8EH9hEb7wYfjuwCrXdndxQ-300w.png&quot; alt=&quot;Memanggil circle di CSS&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;433&quot; srcset=&quot;https://rizafahmi.com/img/1_8EH9hEb7wYfjuwCrXdndxQ-300w.png 300w, https://rizafahmi.com/img/1_8EH9hEb7wYfjuwCrXdndxQ-600w.png 600w, https://rizafahmi.com/img/1_8EH9hEb7wYfjuwCrXdndxQ-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Memanggil circle di CSS&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_Kav2jetOJcCnqXhsAzMAAA-300w.webp 300w, https://rizafahmi.com/img/1_Kav2jetOJcCnqXhsAzMAAA-600w.webp 600w, https://rizafahmi.com/img/1_Kav2jetOJcCnqXhsAzMAAA-1118w.webp 1118w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_Kav2jetOJcCnqXhsAzMAAA-300w.png&quot; alt=&quot;Hasilnya kita bisa menjadikan circle sebagai background dari textarea.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1118&quot; height=&quot;1106&quot; srcset=&quot;https://rizafahmi.com/img/1_Kav2jetOJcCnqXhsAzMAAA-300w.png 300w, https://rizafahmi.com/img/1_Kav2jetOJcCnqXhsAzMAAA-600w.png 600w, https://rizafahmi.com/img/1_Kav2jetOJcCnqXhsAzMAAA-1118w.png 1118w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Hasilnya kita bisa menjadikan circle sebagai background dari textarea.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Gimana, seru ya?! Bayangkan banyak hal yang bisa kita buat dengan Houdini ini. Untuk lebih jelasnya bisa simak video-nya dibawah ini yang kembali dibawakan oleh abang &lt;a href=&quot;https://twitter.com/dassurma&quot;&gt;Surma&lt;/a&gt;.&lt;/p&gt;
&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/lK3OiJvwgSc&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;h3&gt;Sesi WebAssembly&lt;/h3&gt;
&lt;p&gt;Sebenarnya sesi tentang &lt;a href=&quot;https://webassembly.org/&quot;&gt;WebAssembly&lt;/a&gt; ada juga di hari pertama, tapi saya gabungkan saja supaya lebih jelas juga. Saya juga tidak akan terlalu banyak membahas sesinya. Bisa nonton sendiri nanti. Tapi pembahasan saya akan banyak kepada &lt;a href=&quot;https://webassembly.org/&quot;&gt;WebAssembly&lt;/a&gt; itu sendiri.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://webassembly.org/&quot;&gt;WebAssembly&lt;/a&gt; adalah bahasa baru untuk web. Sekarang ini bahasa pemrograman lain dapat menargetkan untuk dikompilasi dan dieksekusi di web dengan bantuan format bahasa wasm atau WebAssembly. Otomatis banyak yang khawatir, gimana nasib JavaScript. Tenang saja, WebAssembly tidak akan menggantikan JavaScript. Justru wasm dan JavaScript akan berjalan beriringan.&lt;/p&gt;
&lt;p&gt;Dengan bantuan wasm, aplikasi berat seperti &lt;a href=&quot;https://web.autocad.com/&quot;&gt;Autocad&lt;/a&gt;, &lt;a href=&quot;https://www.google.com/earth/&quot;&gt;Google Earth&lt;/a&gt; ataupun &lt;a href=&quot;https://www.figma.com/&quot;&gt;Figma&lt;/a&gt; dapat berjalan di web. Ambil contoh &lt;a href=&quot;https://web.autocad.com/&quot;&gt;Autocad&lt;/a&gt;, sebuah aplikasi yang cukup berat yang ditulis dengan C++ sebagai aplikasi desktop. Tanpa banyak perubahan, kode lama dapat dengan mudah dikompilasi ke format wasm dan &lt;em&gt;viola&lt;/em&gt;! Autocad sudah bisa digunakan di web dengan performa yang sama bagusnya dengan versi desktopnya.&lt;/p&gt;
&lt;p&gt;Beberapa bahasa yang sudah bisa dikompilasi ke wasm diantaranya ada C, C++, Rust, dan Lua. Sedangkan Golang, C#, Java, Ruby, Python dan lainnya akan segera menyusul. Dan dukungan dari browser pun sudah mumpuni jadi kita sudah bisa mulai belajar dari sekarang.&lt;/p&gt;
&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/zgOGZgAPUjQ&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;h2&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Perhelatan yang diselenggarakan oleh Google ini sangat seru. Sesi &lt;em&gt;networking&lt;/em&gt;-nya dengan bertemu developer tingkat dewa yang beberapa adalah idola saya merupakan hal yang buat saya membangkitkan semangat untuk bekerja lebih giat mengejar ketertinggalan dan lebih semangat lagi untuk berbagi ilmu dengan developer di Indonesia. Sesi &lt;em&gt;talks&lt;/em&gt;-nya pun tidak kalah seru yang tentunya bisa kita nikmati bersama-sama melalui video.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_ldJrzjIXQ5OoJfDz1fbRgw-300w.webp 300w, https://rizafahmi.com/img/1_ldJrzjIXQ5OoJfDz1fbRgw-600w.webp 600w, https://rizafahmi.com/img/1_ldJrzjIXQ5OoJfDz1fbRgw-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_ldJrzjIXQ5OoJfDz1fbRgw-300w.png&quot; alt=&quot;Bonus: Swaaaagggg!!&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_ldJrzjIXQ5OoJfDz1fbRgw-300w.png 300w, https://rizafahmi.com/img/1_ldJrzjIXQ5OoJfDz1fbRgw-600w.png 600w, https://rizafahmi.com/img/1_ldJrzjIXQ5OoJfDz1fbRgw-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Bonus: Swaaaagggg!!&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Artikel ini pertama kali dipublikasikan di &lt;a href=&quot;https://medium.com/wwwid/pengalaman-pertama-menghadiri-chrome-dev-summit-f2db2d7a17ae&quot;&gt;Medium WWWID&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Perkenalan ReasonML, Sintaks Baru untuk OCaml</title>
    <link href="https://rizafahmi.com/2018/12/10/perkenalan-reasonml/"/>
    <updated>2018-12-10T00:00:00Z</updated>
    <pubDate>2018-12-10T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2018/12/10/perkenalan-reasonml/</id>
    <summary>ReasonML adalah bahasa sintaks, ekstensi dan toolchain yang berada diatas sebuah bahasa jadul OCaml . Selain dapat dikompilasi ke JavaScript dengan bantuan BuckleScript , Reason juga dapat dikompilasi menjadi aplikasi…</summary>
    <category term="catatan, javascript, functional-programming"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/reason.jpeg"/>
    <content type="html">&lt;p&gt;ReasonML adalah bahasa sintaks, ekstensi dan &lt;em&gt;toolchain&lt;/em&gt; yang berada diatas sebuah bahasa &lt;em&gt;jadul&lt;/em&gt; &lt;a href=&quot;https://ocaml.org/&quot;&gt;OCaml&lt;/a&gt;. Selain dapat dikompilasi ke JavaScript dengan bantuan &lt;a href=&quot;https://bucklescript.github.io/&quot;&gt;BuckleScript&lt;/a&gt;, Reason juga dapat dikompilasi menjadi aplikasi native melalui OCaml. Daripada membuat bahasa baru dari awal, tim Facebook memutuskan untuk membuat sintaks baru dan memperkaya &lt;em&gt;environment&lt;/em&gt; OCaml sehingga menjadi lebih modern dan kekinian. OCaml sendiri sudah digunakan lebih dari 20 tahun dan sudah teruji oleh industri sejak tahun 90-an.&lt;/p&gt;
&lt;p&gt;Jika melihat sintaks Reason saat ini sudah mirip dan menyerupai ES6. Lihat perbandingan dibawah ini antara sintaks OCaml, Reason versi awal dan Reason terbaru. Semakin baru, sintaks nya semaki mirip ES6 atau JavaScript modern.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1*i4DqT6krOCc5JH9Fk9CpmQ-300w.webp 300w, https://rizafahmi.com/img/1*i4DqT6krOCc5JH9Fk9CpmQ-600w.webp 600w, https://rizafahmi.com/img/1*i4DqT6krOCc5JH9Fk9CpmQ-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1*i4DqT6krOCc5JH9Fk9CpmQ-300w.png&quot; alt=&quot;Perbandingan sintaks OCaml, Reason lama, dan Reason terbaru.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;681&quot; srcset=&quot;https://rizafahmi.com/img/1*i4DqT6krOCc5JH9Fk9CpmQ-300w.png 300w, https://rizafahmi.com/img/1*i4DqT6krOCc5JH9Fk9CpmQ-600w.png 600w, https://rizafahmi.com/img/1*i4DqT6krOCc5JH9Fk9CpmQ-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Perbandingan sintaks OCaml, Reason lama, dan Reason terbaru.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Kenapa Menggunakan Reason&lt;/h2&gt;
&lt;p&gt;Ada beberapa alasan kenapa teman-teman perlu mempertimbangkan Reason sebagai platform yang layak untuk dipelajari. Selain proses kompilasi yang cepat dan sintaks yang familiar, ada beberapa keunggulan lainnya. Berikut beberapa diantaranya.&lt;/p&gt;
&lt;h3&gt;Type System dan &lt;em&gt;Type Inference&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Seperti yang kita ketahui bersama, JavaScript bukanlah bahasa pemrograman yang memiliki &lt;em&gt;type system.&lt;/em&gt; Dan semakin besar basis kode yang kita miliki akan semakin butuh kita akan &lt;em&gt;type system.&lt;/em&gt; Makanya muncul beberapa solusi seperti TypeScript dan juga Flow.&lt;/p&gt;
&lt;p&gt;TypeScript adalah sebuah bahasa pemrograman dari Microsoft yang merupakan &lt;em&gt;subset&lt;/em&gt; dari JavaScript dengan menambahkan &lt;em&gt;type system&lt;/em&gt;. Jadi kita sebenarnya tetap bisa menulis JavaScript didalam file-file TypeScript.&lt;/p&gt;
&lt;p&gt;Begitu juga dengan Flow, sebuah &lt;em&gt;static type checker&lt;/em&gt; untuk JavaScript yang juga berasal dari Facebook. Flow bertindak sebagai anotasi untuk kode JavaScript yang sudah ada. Uniknya, Flow dikembangkan menggunakan OCaml.&lt;/p&gt;
&lt;p&gt;Dibandingkan dengan Reason? Pertama, Reason bukanlah sintaks baru untuk JavaScript. Reason adalah sintaks baru untuk OCaml, baru kemudian dari OCaml dikompilasi ke JavaScript. Kedua, fitur Reason lebih lengkap dan utamanya &lt;em&gt;type system&lt;/em&gt; jauh lebih &lt;strong&gt;solid&lt;/strong&gt; berkat OCaml.&lt;/p&gt;
&lt;p&gt;Dan yang bikin Reason lebih keren lagi adalah fitur &lt;em&gt;type inference&lt;/em&gt;-nya. Reason dapat menebak &lt;em&gt;type&lt;/em&gt; dari kodingan kita tanpa harus mendefinisikan &lt;em&gt;type&lt;/em&gt;-nya satu-per-satu. Dan fitur ini belum dapat ditandingi oleh TypeScript ataupun Flow. Mari kita lihat contohnya di rtop, REPL untuk Reason.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1*nlpG7UlWXmAhIjF8FbgdyA-300w.webp 300w, https://rizafahmi.com/img/1*nlpG7UlWXmAhIjF8FbgdyA-600w.webp 600w, https://rizafahmi.com/img/1*nlpG7UlWXmAhIjF8FbgdyA-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1*nlpG7UlWXmAhIjF8FbgdyA-300w.png&quot; alt=&quot;Fungsi add menerima dua buah parameter integer dan fungsi add akan me-return integer juga.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;649&quot; srcset=&quot;https://rizafahmi.com/img/1*nlpG7UlWXmAhIjF8FbgdyA-300w.png 300w, https://rizafahmi.com/img/1*nlpG7UlWXmAhIjF8FbgdyA-600w.png 600w, https://rizafahmi.com/img/1*nlpG7UlWXmAhIjF8FbgdyA-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Fungsi add menerima dua buah parameter integer dan fungsi add akan me-return integer juga.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Seperti bisa dilihat, kita membuat sebuah fungsi dengan nama add yang memiliki parameter a dan b dan menghasilkan penjumlahan a dengan b . Ketika mendeklarasikan fungsi add tersebut, kita tidak sama sekali mendefinisikan tipe data dari a, b dan juga hasil dari fungsi add. Akan tetapi setelah dievaluasi, menghasilkan kode berikut ini: &lt;code&gt;let add: (int, int) =&amp;gt; int = &amp;lt;fun&amp;gt;;&lt;/code&gt;. Artinya Reason dapat menebak bahwa tipe data a, b dan juga hasil dari add adalah integer.&lt;/p&gt;
&lt;p&gt;Mari kita lihat satu contoh &lt;em&gt;type inference&lt;/em&gt; lagi yang lebih keren dengan menggunakan struktur data records.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1*GvIibB8iZCIUA2q879Bedg-300w.webp 300w, https://rizafahmi.com/img/1*GvIibB8iZCIUA2q879Bedg-600w.webp 600w, https://rizafahmi.com/img/1*GvIibB8iZCIUA2q879Bedg-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1*GvIibB8iZCIUA2q879Bedg-300w.png&quot; alt=&quot;Reason mampu menebak records sesuai properti yang terkandung didalamnya.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;450&quot; srcset=&quot;https://rizafahmi.com/img/1*GvIibB8iZCIUA2q879Bedg-300w.png 300w, https://rizafahmi.com/img/1*GvIibB8iZCIUA2q879Bedg-600w.png 600w, https://rizafahmi.com/img/1*GvIibB8iZCIUA2q879Bedg-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Reason mampu menebak tipe records sesuai properti yang terkandung didalamnya.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ketika kita mendefinisikan sebuah record, disarankan untuk memberi anotasi atau catatan untuk mengarahkan sebuah variable kepada tipenya. Misalnya &lt;code&gt;let kuririn : person = { age: 31, name: &amp;quot;Kuririn&amp;quot; };&lt;/code&gt;. Disini kita mendefinisikan record baru dengan tipe person seperti yang sudah kita definisikan sebelumnya. Tetapi sebenarnya kita tidak perlu melakukannya, seperti variable chiChi dan piccolo, kita tidak mendefinisikan sebagai tipe person, Reason dapat membedakan tipenya berdasarkan properti yang didefinisikan. Karena chiChi tidak memiliki properti species, maka chiChi dikategorikan sebagai person. Sementara piccolo karena memiliki properti species, maka ia termasuk nonPerson.&lt;/p&gt;
&lt;h3&gt;Pesan Kesalahan yang Manusiawi&lt;/h3&gt;
&lt;p&gt;Dan karena &lt;em&gt;type system&lt;/em&gt; yang solid, Reason dapat menampilkan pesan kesalahan yang cukup detil dan manusiawi. Kita kembali ke contoh fungsi add sebelumnya yang menerima dua parameter integer. Bagaimana jika kita memanggil fungsi tersebut dengan parameter integer dan string?&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1*3VpX4PwJLhVS7e5ag_droQ-300w.webp 300w, https://rizafahmi.com/img/1*3VpX4PwJLhVS7e5ag_droQ-600w.webp 600w, https://rizafahmi.com/img/1*3VpX4PwJLhVS7e5ag_droQ-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1*3VpX4PwJLhVS7e5ag_droQ-300w.png&quot; alt=&quot;Pesan kesalahan yang detil dan manusiawi.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;512&quot; srcset=&quot;https://rizafahmi.com/img/1*3VpX4PwJLhVS7e5ag_droQ-300w.png 300w, https://rizafahmi.com/img/1*3VpX4PwJLhVS7e5ag_droQ-600w.png 600w, https://rizafahmi.com/img/1*3VpX4PwJLhVS7e5ag_droQ-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Pesan kesalahan yang detil dan manusiawi.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dari pesan kesalahan diatas sudah cukup jelas bahwa string “7” merupakan sumber kesalahan, karena diharapkan integer bukan string.&lt;/p&gt;
&lt;p&gt;Jika kita menggunakan JavaScript fungsi tersebut akan dieksekusi dengan baik, meskipun hasilnya salah, yaitu menjadi “67”.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1*zTMnImlX1yGVpZmAjp1WhA-300w.webp 300w, https://rizafahmi.com/img/1*zTMnImlX1yGVpZmAjp1WhA-600w.webp 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1*zTMnImlX1yGVpZmAjp1WhA-300w.png&quot; alt=&quot;Bukan pesan kesalahan yang kita dapatkan, akan tetapi bug yang akan muncul jika di JavaScript&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;600&quot; height=&quot;219&quot; srcset=&quot;https://rizafahmi.com/img/1*zTMnImlX1yGVpZmAjp1WhA-300w.png 300w, https://rizafahmi.com/img/1*zTMnImlX1yGVpZmAjp1WhA-600w.png 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Bukan pesan kesalahan yang kita dapatkan, akan tetapi bug yang akan muncul jika di JavaScript&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Hal ini cukup berbahaya, JavaScript dapat mengeksekusi pemanggilan fungsi diatas tanpa masalah, akan tetapi hasilnya nge-&lt;em&gt;bug&lt;/em&gt;. Sebagai tambahan, Reason juga dapat mendeteksi &lt;em&gt;typo&lt;/em&gt; atau kesalahan pengetikan. Bayangkan berapa banyak bugs dan &lt;em&gt;typo&lt;/em&gt; yang dapat dihindari.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1*6HeGFhbOkfMNG9saWV-FAA-300w.webp 300w, https://rizafahmi.com/img/1*6HeGFhbOkfMNG9saWV-FAA-600w.webp 600w, https://rizafahmi.com/img/1*6HeGFhbOkfMNG9saWV-FAA-998w.webp 998w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1*6HeGFhbOkfMNG9saWV-FAA-300w.png&quot; alt=&quot;Mendeteksi Typo.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;998&quot; height=&quot;334&quot; srcset=&quot;https://rizafahmi.com/img/1*6HeGFhbOkfMNG9saWV-FAA-300w.png 300w, https://rizafahmi.com/img/1*6HeGFhbOkfMNG9saWV-FAA-600w.png 600w, https://rizafahmi.com/img/1*6HeGFhbOkfMNG9saWV-FAA-998w.png 998w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Mendeteksi Typo.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Alat Bantu Yang Kompit&lt;/h3&gt;
&lt;p&gt;Meskipun tergolong baru, Reason sudah dilengkapi dengan alat bantu yang tergolong komplit. Hal ini juga terbantu dengan keputusan untuk menggunakan beberapa alat bantu yang sudah ada seperti yarn/npm, babel, create-react-app dan webpack. Sehingga selain melengkapi alat bantu lain, developer yang sudah terbiasa menggunakan yarn/npm dan webpack menjadi lebih mudah mempelajari Reason.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/3888/1*eqqXemwsvNxetgfUFemx1Q.png&quot; alt=&quot;Reason ‘meminjam’ beberapa alat bantu yang sudah ada di ekosistem JavaScript&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Reason ‘meminjam’ beberapa alat bantu yang sudah ada di ekosistem JavaScript&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Kemudahan Adopsi dan Kemudahan Untuk Dikelola&lt;/h3&gt;
&lt;p&gt;Reason berada di &lt;em&gt;sweet spot&lt;/em&gt; antara kemudahan adopsi dan kemudahan untuk dikelola. Dengan sintaks yang lebih familiar, terutama bagi modern JavaScript developer, mempelajari Reason akan menjadi lebih lancar. Dan dengan bantuan Type System dan fitur-fitur lainnya, kemudahan &lt;em&gt;maintenance&lt;/em&gt; pun dapat dicapai. Terutama dalam menghindari &lt;em&gt;bugs&lt;/em&gt; dan kesalahan yang umum terjadi ketika &lt;em&gt;runtime&lt;/em&gt; dipindah ke &lt;em&gt;compile time&lt;/em&gt; sehingga pengguna tidak terkena dampaknya. Ketika kode Reason berhasil dikompilasi, artinya kode kita sudah terbebas dari *silly mistakes *seperti &lt;em&gt;typo&lt;/em&gt; dan lain sebagainya. Jika tidak, maka proses kompilasi gagal.&lt;/p&gt;
&lt;img src=&quot;https://cdn-images-1.medium.com/max/3840/1*vktrkdYUCyeJQlTfvl7TUA.png&quot; alt=&quot;Grid yang diadaptasi dari talk Jared Forsyth&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
_Grid yang diadaptasi dari talk Jared Forsyth ([https://jaredforsyth.com/](https://jaredforsyth.com/))_
&lt;p&gt;Seperti yang dapat dilihat dari ilustrasi diatas, JavaScript dan ES6 sangat mudah dipelajari. Lain halnya jika kita berbicara *maintenance *kode kita karena JavaScript tidak memiliki type system dan rentan &lt;em&gt;bugs&lt;/em&gt; dan kesalahan. TypeScript masih cenderung mudah dipelajari dan diadopsi. Proses &lt;em&gt;maintenance&lt;/em&gt; kodenya sendiri memang jauh lebih baik daripada JavaScript.&lt;/p&gt;
&lt;p&gt;Dari sisi yang berbeda, maintenance kode di Haskell sangatlah mudah, bahkan jika sudah berjalan, kemungkinan besar kode Haskell tidak perlu dikelola lagi. Akan tetapi Haskell terkenal dengan bahasa yang sulit dimengerti dan dipelajari. Elm adalah versi &lt;em&gt;mainstream&lt;/em&gt; dari Haskell yang juga merupakan bahasa pemrograman yang dapat dikompilasi ke JavaScript.&lt;/p&gt;
&lt;p&gt;Reason berada diposisi yang cukup strategis dimana kemudahan adopsi masih bisa ditoleransi dan kemudahan &lt;em&gt;maintenance&lt;/em&gt; juga masih tergolong cukup baik.&lt;/p&gt;
&lt;h3&gt;Interopabilitas Dengan JavaScript&lt;/h3&gt;
&lt;p&gt;Seperti yang sudah dijelaskan sebelumnya, Reason menggunakan beberapa alat bantu yang juga digunakan oleh JavaScript seperti yarn/npm dan juga webpack. Sehingga ‘jarak’ dengan JavaScript terbilang masih cukup dekat apabila dibandingkan dengan Elm, misalnya.&lt;/p&gt;
&lt;p&gt;Elm, menggunakan ekosistem dan &lt;em&gt;packages&lt;/em&gt; sendiri sehingga cukup menyulitkan apabila kita ingin memanfaatkan &lt;em&gt;library&lt;/em&gt; yang sudah tersedia di npm. Sementara dengan Reason menggunakan &lt;em&gt;library&lt;/em&gt; JavaScript masih sangat memungkinkan.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/3212/1*zTSKdzAuvwzi61RQnUV47w.png&quot; alt=&quot;Interopabilitas Reason dengan JavaScript masih cukup dekat.&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Interopabilitas Reason dengan JavaScript masih cukup dekat.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Komunitas Kecil Tapi Hangat&lt;/h3&gt;
&lt;p&gt;Karena memang masih tergolong baru, komunitas Reason masih cukup kecil untuk ukuran kuantitas, akan tetapi sangat hangat dan fokus.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“The community is small but very focused on delivering a better experience for developers.” &lt;strong&gt;Wojciech Bilicki&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ngga percaya, berikut saya sertakan buktinya. Seorang teman di Facebook mem-post foto ini. Identitas disamarkan, tentunya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/4148/1*gEXMwYk-7bq0LcPYBpHb8A.png&quot; alt=&quot;Disapa oleh Leader Komunitas ketika baru join grup discord.&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Disapa oleh Leader Komunitas ketika baru join grup discord.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Bayangkan, seorang &lt;a href=&quot;https://twitter.com/_chenglou?lang=en&quot;&gt;Cheng Lou&lt;/a&gt;, yang me-&lt;em&gt;lead&lt;/em&gt; project Reason punya waktu untuk &lt;em&gt;say hi&lt;/em&gt; kepada seseorang yang baru join komunitas adalah sebuah sentuhan yang hangat.&lt;/p&gt;
&lt;h3&gt;Bahasa Fungsional Yang Permisif&lt;/h3&gt;
&lt;p&gt;Reason termasuk kedalam kategori bahasa fungsional nan deklaratif. Namun ia tidak melarang ketika kita ‘terpaksa’ menggunakan beberapa sintaks yang imperatif. Ketika kita kesulitan mendeklarasikan baris kode, kita masih dapat menggunakan &lt;em&gt;for loop&lt;/em&gt; yang imperatif atau bahkan variable pun dapat kita buat &lt;em&gt;mutable&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2240/1*RsJilTLJ3joLfNEZG9C1Gw.png&quot; alt=&quot;Penggunaan mutable variable dan imperative loop.&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Penggunaan mutable variable dan imperative loop.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Jadi misalnya kita sedang belajar functional programming tetapi belum menguasai sepenuhnya, Reason tidak akan menghentikanmu menulis kode yang imperatif seperti diatas, sehingga produktifitas tetap terjaga.&lt;/p&gt;
&lt;h2&gt;Memulai Reason&lt;/h2&gt;
&lt;p&gt;Untuk mulai menggunakan Reason, ada beberapa package yang kita butuhkan. Pertama, kita butuh reason-cli . Karena kita akan membuat aplikasi JavaScript di sisi client, kita juga butuh BuckleScript untuk melakukan kompilasi Reason atau OCaml ke JavaScript. Kedua &lt;em&gt;package&lt;/em&gt; tersebut dapat kita install menggunakan yarn atau npm.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;yarn&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; global&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; reason-cli&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;yarn&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; global&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; bs-platform&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Untuk membuat aplikasi sederhana, kita sekarang bisa menggunakan perintah:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;bsb&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; -init&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; nama-app&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; -theme&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; basic-reason&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; nama-app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;tree&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;./reason-demo/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── src&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── Demo.re&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── .gitignore&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── README.md&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── bsconfig.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└── package.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mari kita bahas satu-per-satu. Pertama ada folder src yang berisi kode Reason kita. Kemudian ada package.json yang merupakan daftar &lt;em&gt;dependencies&lt;/em&gt; sama seperti project JavaScript ataupun NodeJS.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2200/1*HCeyWrc1lpvI30BpCB2dbQ.png&quot; alt=&quot;Isi file package.json&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Isi file package.json&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Yang berbeda adalah bsconfig.json yang berisi *dependencies *dan konfigurasi untuk Reason dan BuckleScript seperti definisi source direktori, pengaturan penamaan dan lain sebagainya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2200/1*T-UkFOCEFuCCYB5WOTm6yA.png&quot; alt=&quot;Isi file bsconfig.json&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Isi file bsconfig.json&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sekarang mari kita coba buka file src/Demo.re . Isinya kodenya cukup sederhana, sebuah pesan Hello World.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2240/1*G2-tutUVTQOX1K17E-2CCw.png&quot; alt=&quot;Placeholder kode Demo.re&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Placeholder kode Demo.re&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sekedar informasi, semua modul yang menggunakan Js.* berasal dari BuckleScript. Contohnya Js.log, Js.Promise, Js.then_ dan lain sebagainya. Dan untuk melakukan kompilasi dari Reason menjadi JavaScript, kita tinggal menjalankan perintah berikut.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;yarn&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;line-prefix&quot;&gt;$ &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;tree&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ├── lib&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    │   └── bs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ├── src&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    │   ├── Demo.bs.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    │   └── Demo.re&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ├── .gitignore&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ├── .merlin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ├── README.md&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ├── bsconfig.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    └── package.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dan sekarang sudah ada sebuah file baru, Demo.bs.js . Mari kita lihat isinya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2240/1*p8VliE5_MXpqGOWqbtKKJw.png&quot; alt=&quot;Hasil kompilasi BuckleScript&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Hasil kompilasi BuckleScript&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Seperti yang sudah bisa kita tebak, hasilnya adalah console.log . Script ini kemudian dapat kita gabungkan dengan file html, misalnya seperti ini.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2240/1*8C-dM0qfhXlGmoH7vSExkA.png&quot; alt=&quot;Load JavaScript file ke HTML&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Load JavaScript file ke HTML&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dan kita buka file tersebut di browser dan jangan lupa buka &lt;em&gt;chrome console&lt;/em&gt; untuk melihat hasilnya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/3112/1*8ySipLVTgIAVtXWMgtZNRQ.png&quot; alt=&quot;Dijalankan di browser&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Dijalankan di browser&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Mari sekarang kita belajar sintaks Reason dengan membuat aplikasi perhitungan sederhana. Sekarang coba kita buat file baru src/Calc.re untuk membuat modul baru dengan nama Calc yang akan kita panggil nantinya dari src/Demo.re. Di Reason, file baru secara otomatis menjadi modul sendiri tanpa perlu export dan import. Mari lihat demonya.&lt;/p&gt;
&lt;h2&gt;Mendeklarasikan Variable dan Fungsi&lt;/h2&gt;
&lt;p&gt;Untuk mendeklarasikan fungsi di Reason, mirip sekali dengan notasi yang biasa kita lihat di JavaScript modern. Dengan menggunakan sintaks let diikuti dengan nama fungsinya, notasi = lalu kemudian diikuti dengan pendefinisian argumen atau parameter dan dilanjutkan dengan tanda &lt;em&gt;arrow&lt;/em&gt; =&amp;gt; terakhir diikuti dengan isi fungsinya. Jika isi fungsinya lebih dari satu baris, harus berada didalam &lt;em&gt;scope&lt;/em&gt; dengan {}. Jika hanya satu baris tidak perlu menggunakan &lt;em&gt;scope {}.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2240/1*t8wSThN56mrG-q2smhNjYA.png&quot; alt=&quot;Fungsi add di modul Calc&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Fungsi add di modul Calc&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Untuk memanggil fungsi add dari file Demo.re kita bisa lakukan dengan cukup mudah. Kita bisa menggunakan notasi titik atau &lt;em&gt;dot&lt;/em&gt;. Reason secara otomatis memahami bahwa fungsi add berada didalam file Calc.re ketika kita memanggil dengan cara Calc.add().&lt;/p&gt;
&lt;p&gt;Dan semua proses deklarasi variable menggunakan let . Lebih luas, let di Reason juga digunakan untuk &lt;em&gt;scoping&lt;/em&gt;, mendeklarasikan fungsi, *pattern matching *dan banyak lagi.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2240/1*LAU7t8wv9JrjB2mIjZnPyg.png&quot; alt=&quot;Memanggil modul Calc dan fungsi add dari modul Demo.&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Memanggil modul Calc dan fungsi add dari modul Demo.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Untuk menjalankannya kita bisa lakukan perintah yarn build terlebih dahulu untuk konversi Reason ke JavaScript baru kemudian file JavaScript-nya kita eksekusi atau buka di file index.html yang sebelumnya sudah kita buat.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2696/1*a-hgRCsAQNb1WktCrl7mIw.png&quot; alt=&quot;Opps, error!&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Opps, error!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Wah, ada &lt;em&gt;error&lt;/em&gt; di file Demo.bs.js di baris ke-empat. Mari kita lihat hasil konversinya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2200/1*X1w2p1gQUCcFNBUmVjmLUg.png&quot; alt=&quot;Error require di file Demo.bs.js&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Error require di file Demo.bs.js&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Terjadi kesalahan di sintaks require. Hal ini terjadi karena browser belum mengerti sintaks exports dan juga require. Kita butuh bantuan &lt;em&gt;bundler&lt;/em&gt; seperti webpack, rollup ataupun parcel agar browser dapat mengeksekusinya. Jika Demo.bs.js kita eksekusi di sisi backend dengan NodeJS, semua bisa berjalan normal karena NodeJS sudah mendukung sintaks require dan juga exports. Mari kita lihat.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2112/1*T9_NyXF8Gam1Z5-PuhZiNQ.png&quot; alt=&quot;Di NodeJS aplikasi berjalan normal&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Di NodeJS aplikasi berjalan normal&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Karena kita ingin eksekusi di browser, mari kita buat project baru dan kita gunakan parcel sebagai bundler. Alasannya, karena parcel menerapkan &lt;em&gt;zero-configuration&lt;/em&gt; dibandingkan webpack yang harus melakukan konfigurasi terlebih dahulu. Jika belum, mari kita install parcel terlebih dahulu secara global dengan yarn atau npm. Kemudian kita akan buat folder baru untuk project kita dan buat file index.html.&lt;/p&gt;
&lt;p&gt;$ yarn global add parcel-bundler
$ mkdir reason-parcel
$ cd reason-parcel&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2240/1*6IHWwR3-_poLDzukl0Vs0g.png&quot; alt=&quot;File index.html&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;File index.html&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Buat juga file src/index.re dengan isi hello world terlebih dahulu untuk memastikan parcel berjalan sebagaimana mestinya. Kemudian untuk menjalankan, kita tinggal memanggil perintah parcel index.html.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2240/1*JKgqgN1dSIHGnUKPB3AIHg.png&quot; alt=&quot;Placeholder index.re&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Placeholder index.re&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dan kita juga butuh file bsconfig.json sebagai penanda bahwa folder ini adalah project Reason. Kita samakan saja dengan konfigurasi di project sebelumnya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2200/1*9ExqMLUETZQH39UDGilbCQ.png&quot; alt=&quot;Konfigurasi bsconfig.json&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Konfigurasi bsconfig.json&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Coba jalankan lagi perintah parcel index.html dan kemungkinan besar akan terjadi error karena project tidak mengetahui keberadaan package bs-platform yang kita install secara global sebelumnya. Dan dari pesan kesalahan seharusnya sudah cukup jelas apa yang harus kita lakukan selanjutnya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/4288/1*aB5Vpu42Gvtd1eTqqu2x8A.png&quot; alt=&quot;Package bs-platform tidak ditemukan&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Package bs-platform tidak ditemukan&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Kita tinggal menjalankan perintah npm link bs-platform sehingga npm akan me-&lt;em&gt;link&lt;/em&gt; project ini ke package bs-platform yang sudah kita install secara global sebelumnya.&lt;/p&gt;
&lt;p&gt;$ npm link bs-platform&lt;/p&gt;
&lt;p&gt;Jalankan lagi perintah parcel index.html dan aplikasi kita sudah berjalan di &lt;a href=&quot;http://localhost:1234/&quot;&gt;http://localhost:1234&lt;/a&gt; dan sudah dapat dibuka di browser dan mendapatkan pesan “Hello, world!” di browser console.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2000/1*FeU8LIKqPfWwkBslCb5DOw.png&quot; alt=&quot;Parcel sudah berhasil menjalankan project Reason!&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Parcel sudah berhasil menjalankan project Reason!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sip! Sekarang mari kita buat modul Calc seperti sebelumnya untuk memastikan dapat dieksekusi di browser dengan parcel. Agar berbeda dengan modul Calc sebelumnya, kali ini kita tambahkan &lt;em&gt;type annotation&lt;/em&gt; biar lebih jelas dan akan berguna sebagai dokumentasi juga.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2240/1*2MPbvFjQLPv59EIt9f2Exw.png&quot; alt=&quot;Modul Calc dengan fungsi add, dengan type annotation&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Modul Calc dengan fungsi add, dengan type annotation&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sekarang, mari kita panggil fungsi add tersebut di file index.re sebelumnya. Secara otomatis ketika kita membuat file baru, Reason akan menjadikan file Calc sebagai modul sehingga pemanggilannya dapat dilakukan dengan notasi titik atau &lt;em&gt;dot.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2240/1*caekOhKGcbdLlZrhqjqzSg.png&quot; alt=&quot;Melakukan pemanggilan Modul Calc dan fungsi add.&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Melakukan pemanggilan Modul Calc dan fungsi add.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Hasilnya dapat kita nikmati di console browser seperti berikut.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2000/1*GYlHR2jiPuxSGRHcY5wB2A.png&quot; alt=&quot;Hasil pemanggilan fungsi add.&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Hasil pemanggilan fungsi add.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sekarang mari kita belajar tentang variant dan pattern matching.&lt;/p&gt;
&lt;h2&gt;Variant, Record dan Pattern Matching&lt;/h2&gt;
&lt;p&gt;Variant ini adalah salah satu fitur yang tidak semua bahasa pemrograman punya. JavaScript tidak memiliki fitur ini. Sederhananya, kita bisa membuat struktur data sendiri dengan menggunakan variant. Misalnya kita ingin membuat struktur data spesies yang muncul di komik Dragon Ball.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2000/1*nYhg9HX7er4-1ejej1IVLg.png&quot; alt=&quot;Definisi spesies DragonBall&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Definisi spesies DragonBall&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Kemudian jika kita ingin menciptakan karakter baru dengan spesies tertentu, kita bisa definisikan bentuknya dengan struktur data Record. Record ini mirip object di JavaScript dengan beberapa perbedaan: lebih ringan, cepat, immutable, bentuk dan jumlah &lt;em&gt;field&lt;/em&gt; yang baku, harus mendefinisikan tipe datanya.&lt;/p&gt;
&lt;p&gt;Jadi untuk menggunakan record kita harus mendefinisikan tipe data dan bentuknya seperti berikut.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2240/1*PKmOQMieB9b6lNGUqpBVpw.png&quot; alt=&quot;Tipe Record characters.&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Tipe Record characters.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Setelah didefinisikan bentuk dan tipe datanya barulah kita dapat menggunakan record.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2200/1*N25teCKUFx-S0gZHLcfNjw.png&quot; alt=&quot;Menggunakan record Bejita dengan tipe record characters.&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Menggunakan record Bejita dengan tipe record characters.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dan pattern matching adalah fitur yang sangat powerful. Misalnya untuk contoh diatas, kita ingin mencocokkan apakah karakter yang kita definisikan seorang Namek, Saiya, ataupun yang lain.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2200/1*LuERyXDd1HHbHEsWN5utOg.png&quot; alt=&quot;Mencocokkan berdasarkan species.&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Mencocokkan berdasarkan species.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Namun, jika kita lihat di editor, misalnya VS Code atau vim ada peringatan bahwa pattern matching masih ada yang kurang, atau &lt;em&gt;pattern matching is not exhaustive enough&lt;/em&gt;. Hal seperti ini memang diizinkan di bahasa seperti JavaScript. Tapi bahasa dengan &lt;em&gt;strongly typed&lt;/em&gt; biasanya tidak memperbolehkannya. Solusinya kita harus menulis kasus untuk semua spesies. Atau, kita bisa menggunakan notasi &lt;em&gt;underscore&lt;/em&gt; untuk menyatakan &lt;em&gt;else&lt;/em&gt; atau spesies selain Saiyan atau Namekian.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2200/1*pLlJAkEbEfrdsK_xD5leww.png&quot; alt=&quot;Support Other species&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Support Other species&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Binding dan Interop&lt;/h3&gt;
&lt;p&gt;Seperti yang sudah dijabarkan sebelumnya, interopabilitas Reason dengan JavaScript sangat mudah. Kita bahkan bisa menuliskan sintaks JavaScript dengan bantuan bs.raw().&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2240/1*5gpTjelFVz5Hy3IAqJ7xQQ.png&quot; alt=&quot;Interopabilitas dengan bs.raw&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Interopabilitas dengan bs.raw&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Kita juga bisa menulis sintaks JavaScript yang setelah dievaluasi kemudian di &lt;em&gt;binding&lt;/em&gt; ke variable Reason.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2240/1*xqMqys9wJyGVdUmbei8q4w.png&quot; alt=&quot;Dari JavaScript di binding ke Reason&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Dari JavaScript di binding ke Reason&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Atau yang lebih mantap, kita bisa menggunakan fungsi di JavaScript dan kemudian di &lt;em&gt;binding&lt;/em&gt; atau di &lt;em&gt;mapping&lt;/em&gt; ke variable Reason.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2240/1*uRjDitMfTOiCAiTclrqIXQ.png&quot; alt=&quot;Menggunakan fungsi Math.PI JavaScript dan digunakan di Reason.&quot; class=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;em&gt;Menggunakan fungsi Math.PI JavaScript dan digunakan di Reason.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Reason merupakan pilihan menarik karena sintaks-nya yang modern dan pilihan alat bantu yang lengkap. Keunggulan utamanya dari Reason adalah &lt;em&gt;type system&lt;/em&gt; yang sangat &lt;em&gt;powerful&lt;/em&gt; serta bantuan &lt;em&gt;type inference&lt;/em&gt; sehingga kita tidak perlu mendefinisikan semua tipe data. Hal ini sangat membantu teman-teman yang baru belajar sehingga porsi ketikan menjadi lebih sedikit.&lt;/p&gt;
&lt;p&gt;Reason dapat dikompilasi menjadi JavaScript dengan optimal dan hasilnya pun mudah dibaca, namun juga dapat dikompilasi ke &lt;em&gt;bytecode.&lt;/em&gt; Proses kompilasinya cepat dan apabila terjadi kesalahan, pesan kesalahan sangat detil dan “manusiawi”.&lt;/p&gt;
&lt;p&gt;Jadi, tunggu apalagi?! Tidak ada alasan lagi kan untuk tidak memilih Reason?!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Cara Belajar Pemrograman Yang Cepat dan Efisien</title>
    <link href="https://rizafahmi.com/2018/09/17/cara-belajar-pemrograman/"/>
    <updated>2018-09-17T00:00:00Z</updated>
    <pubDate>2018-09-17T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2018/09/17/cara-belajar-pemrograman/</id>
    <summary>Artikel ini akan memaparkan beberapa tips buat teman-teman yang ingin belajar pemorgraman dengan efisien. Seluruh tips disini murni adalah pengalaman pribadi saya, baik yang saya alami sendiri dan juga hasil diskusi dan…</summary>
    <category term="catatan, belajar, produktivitas, panduan, motivasi"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/goku.png"/>
    <content type="html">&lt;p&gt;Artikel ini akan memaparkan beberapa tips buat teman-teman yang ingin belajar pemorgraman dengan efisien. Seluruh tips disini murni adalah pengalaman pribadi saya, baik yang saya alami sendiri dan juga hasil diskusi dan obrolan dengan teman sesama developer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“I think everybody in this country &lt;strong&gt;should learn how to program&lt;/strong&gt; a computer because it teaches you &lt;strong&gt;how to think&lt;/strong&gt;.” — Steve Jobs dari Apple Inc.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Kenapa Belajar Pemrograman&lt;/h2&gt;
&lt;p&gt;Sebelum kita bahas tentang bagaimana cara belajar, alangkah lebih baik jika kita membahas tentang alasan atau motivasi untuk belajar pemrograman. Teman-teman harus menemukan motivasinya sendiri-sendiri terlebih dahulu agar proses belajar bisa lebih lancar dan efisien. Motivasi adalah elemen penting yang seringkali tidak ditemukan ketika ingin belajar pemrograman.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Masih ada yang &lt;strong&gt;ngibul&lt;/strong&gt; dengan bilang belajar ngoding itu gampang? Percayalah, tidak akan pernah mudah tapi bukan berarti mustahil. — Agung Setiawan dari idrails&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kenapa penting? Karena pemrograman itu adalah hal yang tidak mudah. Dan ketika kita mengalami kesulitan dan bertemu rintangan yang sangat tinggi untuk dilewati, motivasilah yang dapat membantu kita untuk tetap melaju.&lt;/p&gt;
&lt;p&gt;Nah buat teman-teman yang sudah dapat motivasi untuk belajar pemrograman, apapun itu bagus. Artinya langkah pertama sudah terlewati. Namun buat teman-teman yang belum menemukan alasan dan motivasi dan kesulitan menemukannya, berikut beberapa hal yang bisa dijadikan motivasi.&lt;/p&gt;
&lt;h3&gt;Pemrograman Itu Sulit Dipelajari&lt;/h3&gt;
&lt;p&gt;Kalau belajar pemrograman itu sulit, terus kenapa kita harus belajar pemrograman? Kenapa tidak?! Justru karena susah itu dapat menjadikan alasan kita belajar pemrograman. Jika mudah, semua orang saat ini sudah &lt;em&gt;ngoding&lt;/em&gt; dan jadi &lt;em&gt;developer&lt;/em&gt;. Karena susah, itulah sebabnya masih banyak kesempatan dan tantangan buat kita untuk menguasai pemrograman.&lt;/p&gt;
&lt;h3&gt;Pemrograman Melatih Logika Dan &lt;em&gt;Problem Solving&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Pemrograman melatih kita mencari masalah dan menemukan solusi atas masalah tersebut. Jika teman-teman ingin mengasah* skill problem solving* yang sangat dibutuhkan di dunia wirausaha atau &lt;em&gt;entrepreneurship&lt;/em&gt;, maka belajar pemrograman merupakan langkah yang tepat. Karena pemrograman esensinya adalah proses menemukan solusi atas masalah yang ditemukan.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Carilah masalah! Ini adalah hal menarik yang harus dilakukan semua orang. Itulah kerjaan gue, mencari masalah. TAPI, tidak berhenti sampai di masalah, kita juga harus mencari solusi atas masalah tersebut. “— Sofian Hadiwijaya dari Warung Pintar.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Otomasi Pekerjaan&lt;/h3&gt;
&lt;p&gt;Jika teman-teman punya pekerjaan yang &lt;em&gt;boring&lt;/em&gt;, berulang dan itu-itu saja, kita bisa meminta bantuan kepada komputer untuk mengerjakannya untuk kita, dengan bantuan pemrograman tentunya. Membersihkan data yang kurang berguna, &lt;em&gt;generate&lt;/em&gt; laporan, &lt;em&gt;blast&lt;/em&gt; email dan banyak lagi yang bisa kita lakukan dengan bantuan skill &lt;em&gt;programming&lt;/em&gt; yang kita miliki sehingga dapat membuat pekerjaan kita menjadi lebih ringan.&lt;/p&gt;
&lt;h3&gt;Melatih Kerjasama Tim&lt;/h3&gt;
&lt;p&gt;Cepat atau lambat, suka atau tidak suka di satu titik kita harus berhubungan dengan orang lain. Baik itu teman setim, rekan kerja, atasan, bawahan hingga orang lain yang kita &lt;em&gt;hire&lt;/em&gt; untuk melakukan pekerjaan untuk kita. Percaya atau tidak, belajar pemrograman dapat melatih kita bagaimana cara bekerjasama dengan orang lain, terutama bekerja dengan developer lain. Dengan belajar pemrograman kita jadi dapat setidaknya mengetahui bagaimana pola pikir developer sehingga salah persepsi dan miskomunikasi dapat diminimalisir.
Misalnya teman-teman punya ide produk atau &lt;em&gt;startup&lt;/em&gt; dan ingin meminta pihak ketiga untuk membuat aplikasi untuk kita, akan tetapi kita buta teknologi dan tidak tahu banyak tentang pemrograman harus berhati-hati karena bisa-bisa kita tertipu karena tidak mengetahui teknis, &lt;em&gt;scope&lt;/em&gt; pekerjaan dan juga estimasi biaya yang diminta.&lt;/p&gt;
&lt;h3&gt;Membuat Produk atau Startup Sendiri&lt;/h3&gt;
&lt;p&gt;Developer adalah sosok yang unik. Kita, developer mampu membuat sesuatu yang tidak terbayangkan dari nol. Istilah kerennya, &lt;em&gt;we can make something out of nothing&lt;/em&gt;. Tidak sedikit orang-orang belajar pemrograman hanya untuk menggapai mimpinya memiliki produk sendiri. Jadi berbahagialah kita yang sudah jadi developer, kita sudah memiliki kemampuan membuat sesuatu. Jadi tunggu apalagi?! Buatlah sesuatu dan tunjukkan kepada dunia :)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“…I went through 3–4 years thinking I was going to meet some magical engineer who would build all the stuff I was thinking about. But I never met that person, so I taught myself ASP and MS Access out of a book and got to work just hacking stuff together. I’m still a really shitty programmer but I know enough to hack a prototype together.” — Dennis Crowley, co-founder dari Foursquare dan Dodgeball.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dan buat yang bercita-cita ingin punya produk atau startup sendiri, segeralah belajar pemrograman.&lt;/p&gt;
&lt;h3&gt;Masa Depan Cerah&lt;/h3&gt;
&lt;p&gt;Dunia pemrograman dan &lt;em&gt;software&lt;/em&gt; atau aplikasi sedang dalam masa-masa yang menyenangkan. Software menjadi elemen penting dan krusial di segala sisi kehidupan kita. Mulai dari hiburan dengan &lt;em&gt;smart tv&lt;/em&gt;, pendidikan dengan &lt;em&gt;online learning&lt;/em&gt;, hingga berbagai aplikasi &lt;em&gt;mobile&lt;/em&gt; yang kita konsumsi sehari-hari semuanya bergantung kepada *sofware *atau aplikasi yang dibangun oleh &lt;em&gt;developer&lt;/em&gt;. Sehingga secara tidak langsung developer jadi *‘kecipratan’, *memiliki nilai ekstra karena kemampuannya membuat sesuatu.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Software is eating the world, in all sectors. In the future every company will become a software company.” — Mark Andreessen dari Andreessen-Horowitz VC&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Selain itu, kemampuan &lt;em&gt;programming&lt;/em&gt; dapat juga kita gunakan untuk mencari pekerjaan *freelance *dengan memanfaatkan platform seperti UpWork, Freelancer dan masih banyak lagi. Kesempatan terbuka luas karena seluruh dunia membutuhkan &lt;em&gt;developer&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Bagaimana Cara Belajar Pemrograman&lt;/h2&gt;
&lt;p&gt;Ok sekarang kita masuk ke pokok pembicaraan. Saya akan memberikan langkah-langkah yang sebaiknya ditempuh untuk belajar pemrograman dan beberapa contoh implementasinya.&lt;/p&gt;
&lt;h3&gt;Cari Tahu Gaya Belajar Kamu&lt;/h3&gt;
&lt;p&gt;Ini langkah awal yang sangat penting. Teman-teman harus tahu gaya belajar yang bagaimana yang cocok untuk masing-masing individu. Tidak ada cara yang salah atau benar. Yang salah adalah meniru cara belajar orang lain yang ternyata tidak sesuai dengan gaya belajar kita. Semua orang punya cara belajar masing-masing. Ada yang belajar sangat efektif dengan membaca baik itu membaca buku, dokumentasi, artikel atau bahkan membaca &lt;em&gt;source code&lt;/em&gt; orang.&lt;/p&gt;
&lt;p&gt;Kemudian untuk teman-teman yang punya gaya belajar visual bisa belajar dari video online course seperti Udacity, Udemy atau bahkan &lt;a href=&quot;https://randomscreencast.com/&quot;&gt;video di youtube&lt;/a&gt; yang resource-nya berlimpah baik yang gratisan atau yang berbayar. Yang perlu diingat ketika sebuah video atau online course rasanya &lt;em&gt;ngga nyambung&lt;/em&gt;, jangan dipaksakan. Gaya penyampaian di video pun bervariasi. Ada yang menggunakan pendekatan praktikal, teoritikal, menggunakan studi kasus dan lain sebagainya. Cari saja yang paling cocok dan &lt;em&gt;nyambung&lt;/em&gt; dengan kita.&lt;/p&gt;
&lt;p&gt;Bagaimana dengan teman-teman yang audio? Tentu saja bisa. Teman-teman bisa belajar dari audio books atau &lt;a href=&quot;https://ceritanyadeveloper.com/&quot;&gt;podcast&lt;/a&gt;. Saya adalah salah satu orang yang suka sekali mendengarkan podcast terutama ketika sedang dalam perjalanan dari dan ke kantor. Makanya saya juga memproduksi podcast &lt;a href=&quot;https://ceritanyadeveloper.com/&quot;&gt;https://ceritanyadeveloper.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sekali lagi, tidak ada yang salah dengan cara belajar kita. Dan yang membuat lebih menarik adalah kita juga bisa kombinasikan gaya diatas sehingga &lt;em&gt;learning experience&lt;/em&gt; yang kita dapatkan semakin ‘kaya’. Dan hal ini yang biasa saya lakukan ketika ingin belajar hal baru. Saya biasanya mulai dengan &lt;em&gt;video lessons&lt;/em&gt; ditambah dengan mendengarkan podcast ketika perjalanan dari dan ke kantor. Saya mendengarkan podcast yang berkaitan dengan topik yang ingin saya pelajari. Tidak harus langsung mengerti, yang penting dikonsumsi saja semua dulu. Dan ketika ingin menggali lebih dalam, baru saya mencari dan membaca buku ataupun dokumentasi.&lt;/p&gt;
&lt;h3&gt;Belajar &lt;em&gt;Skill&lt;/em&gt; Dasar atau Fundamental&lt;/h3&gt;
&lt;p&gt;Saya adalah tipe orang yang sangat praktikal dan sangat senang belajar dengan cara yang praktikal pula seperti belajar dari studi kasus ataupun belajar hal baru sambil mengerjakan proyek. Dan apabila teman-teman juga punya gaya yang sama, belajarlah sesuatu sambil memperkuat skill fundamental kita.&lt;/p&gt;
&lt;p&gt;Carilah library atau framework yang tidak hanya bagus untuk dipelajari, tetapi juga mampu mengasah skill fundamental kita. Misalnya saja React membantu saya memperkuat fundamental JavaScript saya. Saya jadi belajar hal-hal menarik seperti filter, map, reduce, binding, arrow function hingga scoping saat saya mendalami React. Dan saya jadi lebih tertarik kepada functional programming gara-gara React dan Redux.&lt;/p&gt;
&lt;p&gt;Begitu juga dengan web framework &lt;a href=&quot;http://flask.pocoo.org/&quot;&gt;Flask&lt;/a&gt;. Pertama kali belajar &lt;a href=&quot;https://www.python.org/&quot;&gt;Python&lt;/a&gt;, saya menggunakan &lt;a href=&quot;https://www.djangoproject.com/&quot;&gt;Django&lt;/a&gt; sebagai web framework pilihan. Tapi karena fundamental &lt;a href=&quot;https://www.python.org/&quot;&gt;Python&lt;/a&gt; saya masih kurang, saya merasa bingung dan kurang mengerti cara kerja Django, &lt;em&gt;it’s just works!&lt;/em&gt; Kemudian saya coba belajar framework lain, &lt;a href=&quot;https://trypyramid.com/&quot;&gt;Pyramid&lt;/a&gt; dan akhirnya bertemu yang cocok di framework &lt;a href=&quot;http://flask.pocoo.org/&quot;&gt;Flask&lt;/a&gt;. Fundamental saya sangat terasah dengan framework &lt;a href=&quot;http://flask.pocoo.org/&quot;&gt;Flask&lt;/a&gt; karena &lt;a href=&quot;http://flask.pocoo.org/&quot;&gt;Flask&lt;/a&gt; adalah framework yang isinya sangat minimal. Banyak hal-hal yang harus diurus dan dikerjakan sendiri. Sehingga membantu saya mengerti banyak hal tentang Python itu sendiri. Mungkin banyak orang yang kurang menyukai sebuah framework minimal seperti &lt;a href=&quot;http://flask.pocoo.org/&quot;&gt;Flask&lt;/a&gt; atau Express karena banyak hal yang harus dikerjakan sendiri, akan tetapi karena tujuan saya sambil belajar Python hal-hal yang dikerjakan sendiri justru membuat saya jadi lebih mengerti Python dan cara kerja framework tersebut.&lt;/p&gt;
&lt;p&gt;Jadi carilah framework atau library yang selain ok juga mampu mengasah skill dasar kita sebagai developer. Buat saya React dan Flask, buat teman-teman tentu saja bisa berbeda dengan pilihan saya.&lt;/p&gt;
&lt;h3&gt;Super Fokus&lt;/h3&gt;
&lt;p&gt;Nah hal ini yang kadang-kadang luput dari perhatian. Ketika belajar hal baru, sebaiknya kita fokus kepada satu hal di satu waktu, &lt;em&gt;one step at a time.&lt;/em&gt; Jangan langsung belajar semua sekaligus. Misalnya ingin belajar React, ya fokus belajar React saja, ngga usah belajar React Router, Redux dan teman-temannya. Mau belajar Redux, ya fokus belajar Redux-nya saja, bahkan sebisa mungkin belajar Redux tanpa React dulu. Ketika sudah mengerti baru deh digabungkan sehingga &lt;em&gt;learning curve&lt;/em&gt;-nya jadi lebih ringan.&lt;/p&gt;
&lt;p&gt;Begitu juga di sisi &lt;em&gt;backend.&lt;/em&gt; Belajar web framework terlebih dahulu, tanpa database. Setelah dirasa kompeten barulah belajar database dan koneksikan ke web framework tersebut. Intinya jangan belajar banyak hal sekaligus. Satu per satu.&lt;/p&gt;
&lt;h3&gt;Coding setiap hari&lt;/h3&gt;
&lt;p&gt;Langkah berikutnya ya tinggal &lt;em&gt;ngoding&lt;/em&gt; aja sesering mungkin. Tidak masalah bahasa pemrogramannya atau menggunakan framework apa. &lt;a href=&quot;https://medium.com/@rizafahmi22/5-kebiasaan-coding-yang-menjadikan-kamu-super-developer-d577ca5fd05d&quot;&gt;Sempatkan untuk &lt;em&gt;coding&lt;/em&gt; setiap hari&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dengan melakukan latihan &lt;em&gt;coding&lt;/em&gt; setiap hari, kita menjaga momentum, *flow *dan disiplin. Layaknya latihan yang diberikan oleh &lt;a href=&quot;http://www.imdb.com/character/ch0007693/?ref_=tt_cl_t2&quot;&gt;Mr. Miyagi&lt;/a&gt; dalam film &lt;a href=&quot;http://www.imdb.com/title/tt0087538/?ref_=nv_sr_1&quot;&gt;Karate Kid&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1*4hxId3stzepgLLv_GzAgFw-300w.webp 300w, https://rizafahmi.com/img/1*4hxId3stzepgLLv_GzAgFw-400w.webp 400w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1*4hxId3stzepgLLv_GzAgFw-300w.png&quot; alt=&quot;Wax on wax off&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;400&quot; height=&quot;400&quot; srcset=&quot;https://rizafahmi.com/img/1*4hxId3stzepgLLv_GzAgFw-300w.png 300w, https://rizafahmi.com/img/1*4hxId3stzepgLLv_GzAgFw-400w.png 400w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Wax on wax off&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Awalnya berat memang. Jika terasa berat, ingat-ingat lagi motivasi kita belajar. Dan teman-teman bisa lihat bagaimana semua orang, bahkan &lt;em&gt;expert&lt;/em&gt; sekalipun pernah mengalaminya.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot; data-theme=&quot;dark&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;I failed to learn programming at least 5 times&lt;/p&gt;&amp;mdash; Denny Britz (@dennybritz) &lt;a href=&quot;https://twitter.com/dennybritz/status/899471043135287296?ref_src=twsrc%5Etfw&quot;&gt;August 21, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-conversation=&quot;none&quot; data-lang=&quot;en&quot; data-theme=&quot;dark&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Everyone is a noob, and if they&amp;#39;re not a noob, they&amp;#39;re a specialist, so they&amp;#39;re just a noob at everything else&lt;/p&gt;&amp;mdash; TJ Holowaychuk 🙃 (@tjholowaychuk) &lt;a href=&quot;https://twitter.com/tjholowaychuk/status/899471710059020288?ref_src=twsrc%5Etfw&quot;&gt;August 21, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot; data-theme=&quot;dark&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;If you&amp;#39;re going to sit there and tell me you never struggled as a programmer, and that you always just got it, I&amp;#39;m calling BS.&lt;/p&gt;&amp;mdash; Preethi Kasireddy (@iam_preethi) &lt;a href=&quot;https://twitter.com/iam_preethi/status/899465568922681345?ref_src=twsrc%5Etfw&quot;&gt;August 21, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;Intinya, maju terus, &lt;em&gt;ngoding&lt;/em&gt; terus. Jika masih belum berhasil ulangi lagi dari awal. &lt;em&gt;Ngoding&lt;/em&gt; aja, tidak perlu mencari &lt;em&gt;best practice&lt;/em&gt; untuk tahapan ini. Buat sesuatu, apapun itu. Yang penting teruslah &lt;em&gt;ngoding&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;Berikan Kesempatan Diri&lt;/h3&gt;
&lt;p&gt;Berikan kesempatan diri kita untuk menjadi bodoh, &lt;a href=&quot;https://kadavy.net/blog/posts/permission-to-suck/&quot;&gt;*give yourself permission to suck&lt;/a&gt;*. Tidak masalah kita bodoh dan merasa bodoh, justru kita harus merasa bodoh agar menjadi tidak bodoh lagi di masa depan. Kita akan tetap bodoh hingga kita menjadi bisa dan tidak bodoh lagi :) Dan menjadi bodoh bukanlah masalah. Jangan tanggapi pendapat orang lain.&lt;/p&gt;
&lt;h3&gt;Belajar Secara Imersif&lt;/h3&gt;
&lt;p&gt;Jika kamu belajar sebuah bahasa, coba gunakan bahasa tersebut untuk melakukan apapun. Sulit pasti, terutama diawal tapi ini adalah cara tercepat untuk menguasai sesuatu. Sama saja seperti kita belajar bahasa Inggris misalnya. Akan jauh lebih cepat apabila setiap hari kita menggunakan bahasa Inggris, apalagi jika kita berkesempatan mengunjungi negara yang menggunakan bahasa Inggris.&lt;/p&gt;
&lt;p&gt;Gunakan media belajar sebanyak mungkin, tonton video tutorial, mendengarkan podcast, baca artikel terkait dan lihat bagaimana expert melakukannya sehingga kita juga mendapatkan tambahan motivasi dan inspirasi.&lt;/p&gt;
&lt;h3&gt;Manfaatkan Deadline&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;“A goal is a dream with a deadline” — Napoleon Hill&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tips ini adalah favorit saya. Karena saya bekerja dan belajar sangat efektif dengan &lt;em&gt;deadline&lt;/em&gt;. Ada yang bilang SKS atau sistem kebut semalam adalah hal yang buruk. Buat saya tidak :) Saya adalah procastination sejati ;) Jadi saya butuh deadline untuk &lt;em&gt;pressure.&lt;/em&gt; Apabila saya tidak menetapkan deadline, saya tidak akan pernah selesai belajar atau menyelesaikan pekerjaan saya. Saya akan menunda hingga mendekati deadline. Itulah sebabnya buat saya deadline itu penting.&lt;/p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;440px&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; id=&quot;player&quot; src=&quot;https://embed.ted.com/talks/tim_urban_inside_the_mind_of_a_master_procrastinator?referrer=https%3A%2F%2Fcdn.embedly.com%2F&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Misalnya ketika skripsi yang seharusnya kita kerjakan selama enam bulan atau satu semester. Bisakah kita kerjakan selama dua bulan atau bahkan dua minggu?! Pasti jawabannya tidak. Tapi ketika kita akan mengerjakannya, biasanya kita menganggap enteng, “Ah, masih enam bulan lagi, santai lah.”. Selang dua bulan “Masih ada empat bulan kok, nge-game dulu aja, nanti setelah itu baru mulai ngerjain skripsi.”. Sisa dua bulan, baru deh panik dan mulai mengerjakan.&lt;/p&gt;
&lt;p&gt;Jadi deadline dapat membantu kita menambah motivasi dan juga fokus. Motivasi jika skripsi tidak kita selesaikan, kita harus menunda rencana wisuda, dan harus membayar uang semester dan lain sebagainya. Sehingga memaksa kita untuk menyelesaikannya apapun yang terjadi, harus selesai. Saya menyebut fenomena ini sebagai &lt;strong&gt;The Power of Kepepet&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Begitu juga dengan belajar. Buatlah sebuah deadline yang jika tidak kita selesaikan pada waktunya ada semacam hukuman atau &lt;em&gt;punishment&lt;/em&gt;. Misalnya apabila saya tidak bisa menguasai React, project yang sedang saya kerjakan tidak akan selesai, dan mengakibatkan uang proyek tidak cair dan lain sebagainya. &lt;strong&gt;The Power of Kepepet&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Jadi untuk belajar pemrograman, tidak ada cara yang benar atau yang salah. Yang ada, cara belajar yang efektif dan tidak efektif. Beberapa hal yang harus diperhatikan ketika akan belajar pemrograman adalah motivasi, carilah cara belajar yang efisien dan efektif versi kamu, belajar hal fundamental, fokus dan terus belajar. Terakhir, jangan lupa set deadline agar kamu mendapatkan motivasi tambahan dan menjadi super s̵a̵i̵y̵a̵ developer.&lt;/p&gt;
&lt;p&gt;Jika teman-teman punya cara atau gaya belajar pemrograman yang menarik dan belum di-&lt;em&gt;mention&lt;/em&gt; di artikel ini, &lt;em&gt;share&lt;/em&gt; dong di kolom komentar. Pasti akan berguna untuk teman-teman yang lain juga.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Machine Learning for Web Developers</title>
    <link href="https://rizafahmi.com/2018/08/20/machine-learning-for-web-developers/"/>
    <updated>2018-08-20T00:00:00Z</updated>
    <pubDate>2018-08-20T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2018/08/20/machine-learning-for-web-developers/</id>
    <summary>Berikut adalah cuplikan video sesi yang saya bawakan di event Product Development Conference TechInAsia 2018 di Juli 2018 yang lalu. Kali ini saya membawakan topik yang sedang happening, tentang Machine Learning.…</summary>
    <category term="catatan, machine-learning, web, javascript"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/IMG20180705162500.jpg"/>
    <content type="html">&lt;p&gt;Berikut adalah cuplikan video sesi yang saya bawakan di event Product Development Conference TechInAsia 2018 di Juli 2018 yang lalu. Kali ini saya membawakan topik yang sedang happening, tentang Machine Learning.&lt;/p&gt;
&lt;p&gt;Sebenarnya kepikiran membawakan topik ini karena pas diundang &lt;a href=&quot;https://www.facebook.com/rizafahmidotcom&quot;&gt;Facebook&lt;/a&gt; ke acara &lt;a href=&quot;https://developers.facebook.com/videos&quot;&gt;F8 Developer Conference&lt;/a&gt; beberapa bulan yang lalu. Disana saya bertemu idola saya &lt;a href=&quot;https://twitter.com/ericnakagawa&quot;&gt;Eric Nakagawa&lt;/a&gt; dan dia menyarankan saya dan developer di Indonesia untuk segera belajar tentang Machine Learning. Karena menurutnya, Artificial Intelligence dan Machine Learning adalah masa depan.&lt;/p&gt;
&lt;p&gt;Untuk cerita lengkapnya bisa baca &lt;a href=&quot;https://medium.com/@rizafahmi22/f8-silicon-valley-trip-day-1-4b501b0bfd8a&quot;&gt;artikel medium&lt;/a&gt; yang saya tulis dalam bentuk serial (&lt;a href=&quot;https://medium.com/@rizafahmi22/f8-san-jose-trip-day-0-c716ed119bc5&quot;&gt;bagian 1&lt;/a&gt;, &lt;a href=&quot;https://medium.com/@rizafahmi22/f8-silicon-valley-trip-day-1-4b501b0bfd8a&quot;&gt;bagian 2&lt;/a&gt;, &lt;a href=&quot;https://medium.com/@rizafahmi22/f8-silicon-valley-day-2-5081ba3d2b16&quot;&gt;bagian 3&lt;/a&gt; dan &lt;a href=&quot;https://medium.com/@rizafahmi22/f8-silicon-valley-trip-day-3-4-159f256fe2b8&quot;&gt;bagian 4&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Tujuan utama dari sesi ini sebenarnya adalah untuk mengajak teman-teman semua belajar bareng sebenarnya :) Saya juga baru mulai belajar Machine Learning dan akan sangat membantu sekali jika ada teman-teman yang kebetulan membaca artikel ini juga tertarik untuk belajar. Karena belajar bareng lebih keren dan lebih efektif. Jadi kalau teman-teman tertarik belajar Machine Learning dan Artificial Intelligence, kirim email ke saya dan mari kita belajar bersama :)&lt;/p&gt;
&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/uOprsF1ri6k&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;p&gt;&lt;strong&gt;Slide&lt;/strong&gt;: &lt;a href=&quot;https://www.slideshare.net/rizafahmi/machine-learning-for-web-developers&quot;&gt;Slideshare&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Repo&lt;/strong&gt;: &lt;a href=&quot;https://github.com/rizafahmi/simple-predict-tfjs-vanilla&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Referensi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://js.tensorflow.org/&quot;&gt;https://js.tensorflow.org&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://course.fast.ai/&quot;&gt;http://course.fast.ai/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://ocdevel.com/podcasts/machine-learning&quot;&gt;http://ocdevel.com/podcasts/machine-learning&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Artikel ini dirangkum dari episode ke-19 &lt;a href=&quot;https://randomscreencast.com/19-ml-for-webdevs&quot;&gt;RandomScreencast&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Tutorial Singkat Tentang Tensorflow.js</title>
    <link href="https://rizafahmi.com/2018/07/25/screencast-singkat-tentang-tensorflow-js/"/>
    <updated>2018-07-25T00:00:00Z</updated>
    <pubDate>2018-07-25T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2018/07/25/screencast-singkat-tentang-tensorflow-js/</id>
    <summary>Tensorflow.js adalah sebuah library yang dibangun diatas deeplearn.js untuk membuat modul deep learninglangsung dari web browser! Deep learning sendiri adalah sebuah cabang dari machine learning dan juga artificial…</summary>
    <category term="catatan, javascript, machine-learning, ai, tutorial"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/screencast-singkat-tentang-tensorflow-js.png"/>
    <content type="html">&lt;p&gt;Tensorflow.js adalah sebuah library yang dibangun diatas deeplearn.js untuk membuat modul deep learninglangsung dari web browser! Deep learning sendiri adalah sebuah cabang dari machine learning dan juga artificial intelligence. Dengan Tensorflow.js kita dapat membuat implementasi Convolutional Neural Network (CNN), Recurrent Neural Network (RNN) dan lain sebagainya.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tensorflow.org/&quot;&gt;Tensorflow&lt;/a&gt; sendiri merupakan library yang ditulis dengan bahasa C++ dan biasanya digunakan dengan bahasa pemrograman Python. Dengan adanya tensorflow.js, kita sekarang sudah bisa menggunakan beberapa fitur tensorflow di sisi web browser tanpa harus dibebani oleh instalasi yang cukup ‘menantang’. Dengan Tensorflow.js kita tinggal melakukan instalasi dengan npm install @tensorflow/tfjs ataupun juga dengan menggunakan CDN.&lt;/p&gt;
&lt;p&gt;Berikut ini adalah cuplikan kode untuk memprediksi harga rumah berdasarkan luas tanah/luas bangunan.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;button class=&quot;code-copy&quot; aria-label=&quot;Salin kode&quot;&gt;Salin&lt;/button&gt;&lt;pre class=&quot;shiki dark-plus&quot; style=&quot;background-color:#1E1E1E;color:#D4D4D4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; tf&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;@tensorflow/tfjs&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// Define a model for linear regression.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; model&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;tf&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;sequential&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;tf&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;layers&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dense&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;({ &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;units:&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;inputShape:&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;] }));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// Prepare the model for training: Specify the loss and the optimizer.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;compile&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;({ &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;loss:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;meanSquaredError&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;optimizer:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &quot;sgd&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// Provide some housing data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; xs&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;tf&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;tensor1d&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;7.9&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;8.1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;8.3&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;8.5&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;8.6&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;8.4&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; ys&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;tf&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;tensor1d&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;738967&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;742371&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;750984&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;759598&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;763905&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;755291&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// Train the model using the data provided&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;fit&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;xs&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;ys&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;then&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(() &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; form&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;getElementById&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;myform&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; inputText&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;getElementById&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;inputText&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; predictPlaceholder&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;getElementById&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;predict&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  form&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;submit&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    e&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;preventDefault&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    // Use the model to predict or to inference&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#4FC1FF&quot;&gt; output&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;predict&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;      tf&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;tensor2d&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;parseFloat&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;inputText&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) / &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;], [&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    predictPlaceholder&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;innerHTML&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;formatting&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Array&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;output&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;dataSync&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;())[&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; formatting&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; = (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;num&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;  num&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; *= &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1000&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; num&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;toString&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#D16969&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;&#92;B&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;(?=(&lt;/span&gt;&lt;span style=&quot;color:#D16969&quot;&gt;&#92;d&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;{3}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;(?!&lt;/span&gt;&lt;span style=&quot;color:#D16969&quot;&gt;&#92;d&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;color:#D16969&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;g&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Untuk mengetahui lebih lanjut silakan simak video berikut ini.&lt;/p&gt;
&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/iO_-8c3fqZM&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;p&gt;&lt;strong&gt;Repo&lt;/strong&gt;: &lt;a href=&quot;https://github.com/rizafahmi/simple-predict-tfjs-vanilla&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Referensi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://js.tensorflow.org/&quot;&gt;https://js.tensorflow.org&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://parceljs.org/&quot;&gt;https://parceljs.org/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://www.carbondesignsystem.com/&quot;&gt;http://www.carbondesignsystem.com/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Artikel ini dirangkum dari &lt;a href=&quot;https://randomscreencast.com/18-tensorflowjs/&quot;&gt;episode ke-18 randomscreencast.com&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Rangkuman Acara Developer Circles Jakarta Build Day 2018</title>
    <link href="https://rizafahmi.com/2018/07/12/rangkuman-acara-devc-jakarta-build-day-2018/"/>
    <updated>2018-07-12T00:00:00Z</updated>
    <pubDate>2018-07-12T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2018/07/12/rangkuman-acara-devc-jakarta-build-day-2018/</id>
    <summary>Meetup DeveloperCircles Jakarta Build Day 2018 Di awal bulan juli ini DevC Jakarta baru saja selesai mengadakan meetup yang secara regular dilakukan setiap bulannya. Berbeda dengan meetup di bulan sebelumnya, meetup…</summary>
    <category term="catatan, komunitas, rangkuman"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/devc.jpeg"/>
    <content type="html">&lt;h2&gt;Meetup DeveloperCircles Jakarta Build Day 2018&lt;/h2&gt;
&lt;p&gt;Di awal bulan juli ini &lt;a href=&quot;https://www.facebook.com/groups/DevCJakarta/&quot;&gt;DevC Jakarta&lt;/a&gt; baru saja selesai mengadakan meetup yang secara regular dilakukan setiap bulannya. Berbeda dengan meetup di bulan sebelumnya, meetup kali ini cukup spesial. Ya, DevC Jakarta menggelar sebuah &lt;em&gt;event&lt;/em&gt; global namanya &lt;a href=&quot;https://developers.facebook.com/blog/post/2018/05/01/developer-circles-community-challenge/&quot;&gt; Build Day 2018 &lt;/a&gt;. DevC diseluruh dunia sudah dan akan menggelar perhelatan serupa.&lt;/p&gt;
&lt;p&gt;Build Day sendiri merupakan inisiasi dari. Facebook dalam rangka ‘merangsang’ dan menantang developer dan makers untuk membuat sebuah karya dengan tema community building. Seperti yang disampaikan di &lt;a href=&quot;https://medium.com/@rizafahmi22/f8-silicon-valley-trip-day-1-4b501b0bfd8a&quot;&gt;F8 Developer Conference&lt;/a&gt; beberapa waktu yang lalu.&lt;/p&gt;
&lt;p&gt;Dan karena ini adalah momen spesial, DevC Jakarta melakukannya dengan cara yang spesial pula. Jika &lt;em&gt;meetup&lt;/em&gt; bulanan dilakukan satu hari, kali ini kita melakukannya dua hari berturut-turut! Hari pertama kita menggelar acara &lt;em&gt;TechTalk&lt;/em&gt; untuk memberi inspirasi dan aspirasi disusul dengan acara Ideation untuk memformulasikan ide menjadi sebuah produk yang siap untuk dikembangkan. Tujuan akhirnya adalah mengajak teman-teman developer dan &lt;em&gt;maker&lt;/em&gt; untuk mengikuti &lt;a href=&quot;https://devcommunitychallenge.devpost.com/&quot;&gt;Build Day&lt;/a&gt; yang diikuti oleh ribuan orang diseluruh dunia.&lt;/p&gt;
&lt;p&gt;Lebih spesial lagi, TechTalk kali ini mendatangkan dua orang pembicara keren. Mereka berdua adalah developer Facebook yang berasal dari Indonesia! TechTalk dibuka oleh Mas Ziyad Bazed yang berbagi &lt;em&gt;insight&lt;/em&gt; tentang bagaimana Facebook membangun aplikasi yang &lt;em&gt;secure&lt;/em&gt;. Dilanjutkan dengan Mas Riandy yang memberikan tips dan trik mengembangkan chatbot terutama untuk platform Messenger.&lt;/p&gt;
&lt;h2&gt;Insight Menarik Dari Dua Engineer Facebook Asal Indonesia&lt;/h2&gt;
&lt;p&gt;Mas Ziyad memulai presentasi dengan memperkenalkan dirinya sebagai Engineer yang sudah berkarya selama kurang lebih empat tahun di Facebook dan juga memperlihatkan &lt;em&gt;screenshot&lt;/em&gt; dari aplikasi Facebook Lite, sebuah aplikasi Facebook versi ringan untuk mengakomodir user dengan keterbatasan data dan device. Kelebihan dari Facebook Lite ini adalah mampu menghemat data dan lebih ramah terutama dalam penggunaan memori handphone.&lt;/p&gt;
&lt;p&gt;Saya jadi teringat bagaimana Mas Ziyad berbagi ilmu ketika mengisi acara serupa tahun 2017 silam. Saat itu Mas Ziyad berbicara tentang teknologi dibelakang Facebook Lite dan seputar development aplikasi di platform Android.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/ziyad-300w.webp 300w, https://rizafahmi.com/img/ziyad-600w.webp 600w, https://rizafahmi.com/img/ziyad-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/ziyad-300w.png&quot; alt=&quot;Sesi Ziyad Bazed&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;800&quot; srcset=&quot;https://rizafahmi.com/img/ziyad-300w.png 300w, https://rizafahmi.com/img/ziyad-600w.png 600w, https://rizafahmi.com/img/ziyad-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Sesi Ziyad Bazed&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Masuk ke topik utama, Mas Ziyad memaparkan beberapa hal terkait kultur pengembangan aplikasi di internal Facebook seperti kultur code review, continuous delivery, monorepo dan mono branch hingga perjalanan dari perkembangan library/framework yang digunakan oleh facebook dari awal hingga saat ini. Seperti yang kita ketahui bersama, Facebook berawal dari sebuah media sosial online hingga sekarang memiliki berbagai produk lainnya seperti Instagram, Oculus, WhatsApp, Messenger dan lain sebagainya. Berikut beberapa hal-hal menarik yang saya dapatkan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Facebook menerapkan code review (tentu saja)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Facebook juga melakukan crowdsourcing untuk membasmi bugs (bountyhunter) dan mengeluarkan sekitar 6 juta dolar untuk itu&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Facebook menerapkan* open codebase* dan monorepo sehingga semua code dari seluruh produk facebook dapat diakses oleh seluruh karyawan facebook dan tentunya dapat berkontribusi kepada produk yang diinginkan.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Facebook juga menerapkan mono branch. Hanya branch master. Sedikit mengejutkan karena biasanya untuk best practice ada beberapa branch yang digunakan seperti devel atau development branch. Dengan menerapkan mono branch, proses code review dan merge harus benar-benar ‘rapi’ sehingga kemungkinan yang dapat merusak branch master harus diminimalisir.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Seluruh produk Facebook menggunakan stack yang minimal. Produk yang menggunakan konsep &lt;em&gt;microservice&lt;/em&gt; atau &lt;em&gt;micro frontend&lt;/em&gt; dengan teknologi yang berbeda hampir tidak ada. Stack yang digunakan cukup &lt;em&gt;straightforward&lt;/em&gt; dan &lt;em&gt;no brainer&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Seperti yang kita ketahui bersama, Facebook menggunakan PHP saat pengembangan awal. Setelah beberapa waktu, Facebook kemudian mengembangkan sebuah bahasa baru, &lt;a href=&quot;https://hacklang.org/&quot;&gt;HackLang&lt;/a&gt; yang merupakan pengembangan lebih lengkap dari PHP, terutama beberapa fitur yang dibutuhkan Facebook dan belum tersedia di PHP saat itu dan juga ditambah dengan beberapa tweak sehingga mampu mencapai performa yang diinginkan oleh Facebook.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sudah seperti rahasia umum di kalangan developer Facebook, ketika ada indikasi bahwa yang mereka lakukan adalah hal berbahaya biasanya para developer ini menandainya dengan membuat variable yang menunjukkan hal tersebut. Misalnya saja &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt;, &lt;code&gt;UNSAFE_componentWillMount&lt;/code&gt; dan lain sebagainya.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tim &lt;em&gt;engineering&lt;/em&gt; Facebook tidak memiliki tim &lt;em&gt;tester&lt;/em&gt; atau QA. &lt;em&gt;Engineer&lt;/em&gt; sendiri yang bertanggungjawab melakukan testing terhadap &lt;em&gt;code&lt;/em&gt;-nya.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Building Your Chatbot on Messenger&lt;/h2&gt;
&lt;p&gt;Sesi TechTalk kemudian dilanjutkan oleh Mas Riandy yang membawakan topik tentang bagaimana dan mengapa membuat messenger bot. Ada lima langkah mudah dalam membuat messenger bot:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Generate access token&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Menerima data dengan &lt;em&gt;webhooks&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mengirimkan data ke Graph API. Bisa menggunakan template seperti &lt;em&gt;button, generic, receipt, carousel,&lt;/em&gt; dll.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Buat bot kamu semakin mudah ditemukan dengan:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Plugin&lt;/em&gt; “send to messenger”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shortlink seperti m.me/CNN&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Messenger code, yang lebih keren dari qr code&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Persenjatai bot kamu dengan kemampuan bahasa dengan wit.ai&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/riandy-300w.webp 300w, https://rizafahmi.com/img/riandy-600w.webp 600w, https://rizafahmi.com/img/riandy-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/riandy-300w.png&quot; alt=&quot;Sesi Mas Riandy&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;800&quot; srcset=&quot;https://rizafahmi.com/img/riandy-300w.png 300w, https://rizafahmi.com/img/riandy-600w.png 600w, https://rizafahmi.com/img/riandy-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Sesi Mas Riandy&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Mas Riandy juga membahas. beberapa fitur keren dari Messenger seperti &lt;em&gt;card&lt;/em&gt;, &lt;em&gt;user’s identity&lt;/em&gt;, kemampuan menampilkan web dengan &lt;em&gt;webview&lt;/em&gt;, &lt;em&gt;qr code&lt;/em&gt; yang keren dan beda, dll.&lt;/p&gt;
&lt;p&gt;Kemudian Mas Riandy juga membahas tentang bagaimana sebuah bot sebenarnya bekerja di belakang layar. Secara sederhana, sebenarnya hanya menggunakan dua API, yaitu &lt;em&gt;send&lt;/em&gt; dan &lt;em&gt;receive&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Dan untuk membuat sebuah bot lebih menarik, &lt;em&gt;bot&lt;/em&gt; &lt;em&gt;messenger&lt;/em&gt; juga dapat dipersenjatai dengan teknik Natural Language Processing atau NLP dengan bantuan &lt;a href=&quot;https://wit.ai/&quot;&gt;wit.ai&lt;/a&gt; ataupun produk sejenis seperti &lt;a href=&quot;https://dialogflow.com/&quot;&gt;dialogflow&lt;/a&gt;, dan lain sebagainya.&lt;/p&gt;
&lt;h2&gt;Hari kedua&lt;/h2&gt;
&lt;p&gt;Beberapa hari sebelum acara dimulai, para peserta yang sudah memiliki ide atau yang belum diminta untuk mengisi form pendaftaran. Dari 105 pendaftar, ada 40 peserta terpilih yang berkesempatan mengikuti acara di hari kedua yang kita namakan Ideathon. Konsepnya mirip dengan hackathon, bedanya adalah ini baru tahap formulasi ide jadi belum ada proses development aplikasi di tahapan ini.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/mentoring-300w.webp 300w, https://rizafahmi.com/img/mentoring-600w.webp 600w, https://rizafahmi.com/img/mentoring-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/mentoring-300w.png&quot; alt=&quot;Sesi mentoring Ideathon&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;675&quot; srcset=&quot;https://rizafahmi.com/img/mentoring-300w.png 300w, https://rizafahmi.com/img/mentoring-600w.png 600w, https://rizafahmi.com/img/mentoring-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Sesi mentoring Ideathon&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Tujuan Ideathon ini adalah untuk melatih kreatifitas sekaligus mendorong teman-teman developer dan maker untuk mengikuti Build Day yang diadakan secara global oleh Facebook.&lt;/p&gt;
&lt;p&gt;Dan agar kesempatan menang lebih tinggi, Ideathon juga menghadirkan mentor-mentor dan juri ternama. Berikut beberapa diantaranya:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Russel Siregar, Product Manager at Quipper&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rosidi Pratama, Product Manager at Kumparan&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rian Agustama, Product Manager at Bukalapak&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bima Arafah, Head of Product at Kumparan&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I Gede Agastya Darma Laksana, Engineer at Kumparan&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Winner Manurung, Product Manager at Blibli.com&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Irvan Adhitya, Engineer at Style Theory&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Willy Anderson, Product Manager at Blibli.com&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rizki Ridha, UX Researcher at Blibli.com&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Irfan Maulana, Engineer at bizzy&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alfandio Greshaldi, UX Researcher at Blibli.com&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Abdurrachman Mappuji, Engineer at MidTrans&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mentor-mentor kemudian dibagi kedalam grup-grup dan memberikan &lt;em&gt;insight&lt;/em&gt; terhadap ide awal peserta hingga mengarahkan mereka untuk memikirkan fitur-fitur dari berbagai sisi baik itu produk, UI/UX hingga teknologi yang digunakan.&lt;/p&gt;
&lt;p&gt;Ideathon ditutup dengan presentasi dari seluruh kelompok dan ada dua yang mendapatkan award: Best Idea dan Favorite Idea pilihan komunitas.&lt;/p&gt;
&lt;p&gt;Berikut adalah ketujuh ide yang masuk babak penjurian:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Termentori — &lt;a href=&quot;https://m.facebook.com/groups/313087542449350?view=permalink&amp;amp;id=468718680219568&quot;&gt;https://m.facebook.com/groups/313087542449350?view=permalink&amp;amp;id=468718680219568&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Taninesia — &lt;a href=&quot;https://m.facebook.com/groups/313087542449350?view=permalink&amp;amp;id=468719696886133&quot;&gt;https://m.facebook.com/groups/313087542449350?view=permalink&amp;amp;id=468719696886133&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Goyong — &lt;a href=&quot;https://m.facebook.com/groups/313087542449350?view=permalink&amp;amp;id=468749936883109&quot;&gt;https://m.facebook.com/groups/313087542449350?view=permalink&amp;amp;id=468749936883109&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Traveasy — &lt;a href=&quot;https://m.facebook.com/groups/313087542449350?view=permalink&amp;amp;id=468743473550422&quot;&gt;https://m.facebook.com/groups/313087542449350?view=permalink&amp;amp;id=468743473550422&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Doktersiaga — &lt;a href=&quot;https://www.facebook.com/groups/DevCJakarta/permalink/468747403550029/&quot;&gt;https://www.facebook.com/groups/DevCJakarta/permalink/468747403550029/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vigibot — &lt;a href=&quot;https://m.facebook.com/groups/313087542449350?view=permalink&amp;amp;id=468722373552532&quot;&gt;https://m.facebook.com/groups/313087542449350?view=permalink&amp;amp;id=468722373552532&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Educare — &lt;a href=&quot;https://m.facebook.com/groups/313087542449350?view=permalink&amp;amp;id=468721536885949&quot;&gt;https://m.facebook.com/groups/313087542449350?view=permalink&amp;amp;id=468721536885949&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dan pemenang &lt;em&gt;best idea&lt;/em&gt; adalah DoktorSiaga, tim yang beranggotakan tiga orang: Fatah Iskandar Akbar, Fadelli Yahya Polosoro, dan Erwin RA.&lt;/p&gt;
&lt;p&gt;Sedangkan ide favorit jatuh kepada tim Taninesia berdasarkan jumlah like dan komentar yang berhasil mereka kumpulkan di Facebook. Tim Taninesia sendiri, yang beranggotakan enam orang, memiliki fokus pada para petani Indonesia. Mirip dengan DoktorSiaga, Taninesia juga merupakan chatbot.&lt;/p&gt;
&lt;p&gt;Selamat buat tim yang menang. Yang belum berhasil tetap bisa mengikuti Facebook Community Challenge 2018 yang deadline-nya tanggal 26 Juli 2018. Hadiah 30 ribu US dolar menunggu!&lt;/p&gt;
&lt;p&gt;Sebagai informasi tambahan, produk buatan teman-teman dari bandung dengan nama BurhanBot berhasil mendapatkan peringkat ketiga di perhelatan yang sama di tahun lalu.&lt;/p&gt;
&lt;p&gt;Ditunggu kehadirannya di even DeveloperCircles berikutnya dan buat teman-teman yang tertarik untuk bergabung dengan komunitas DeveloperCircles Jakarta, silakan gabung di grup kita di &lt;a href=&quot;https://www.facebook.com/groups/DevCJakarta/&quot;&gt;https://www.facebook.com/groups/DevCJakarta/.&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>F8 Silicon Valley Trip Day 3–4</title>
    <link href="https://rizafahmi.com/2018/05/28/f8-san-jose-trip-day-3-4/"/>
    <updated>2018-05-28T00:00:00Z</updated>
    <pubDate>2018-05-28T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2018/05/28/f8-san-jose-trip-day-3-4/</id>
    <summary>Ini adalah cerita berseri tentang perjalanan saya dan teman-teman Facebook Developer Circle Leads ke Silicon Valley dalam rangka mengikuti Facebook F8 Developer Conference. Ini adalah bagian terakhir dari rangkaian…</summary>
    <category term="catatan, komunitas, konferensi, travel"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/f8-silicon-valley-trip-day-3-4.png"/>
    <content type="html">&lt;p&gt;Ini adalah cerita berseri tentang perjalanan saya dan teman-teman Facebook Developer Circle Leads ke Silicon Valley dalam rangka mengikuti Facebook F8 Developer Conference. Ini adalah bagian terakhir dari rangkaian cerita perjalanan yang seru ini. Ikuti dari &lt;a href=&quot;https://rizafahmi.com/2018/05/08/f8-san-jose-trip-day-0/&quot;&gt; bagian 0 &lt;/a&gt;, &lt;a href=&quot;https://rizafahmi.com/2018/05/14/f8-san-jose-trip-day-1/&quot;&gt; bagian 1 &lt;/a&gt; dan &lt;a href=&quot;https://rizafahmi.com/2018/05/21/f8-san-jose-trip-day-2/&quot;&gt; bagian 2 &lt;/a&gt; supaya mendapatkan jalan ceritanya secara keseluruhan.&lt;/p&gt;
&lt;p&gt;Perhelatan F8 Conference telah usai. Tapi cerita tidak usai sampai disini karena semua &lt;em&gt;leads&lt;/em&gt; dari Indonesia sepakat untuk &lt;em&gt;extend&lt;/em&gt; sampai hari sabtu. Saya dan empat &lt;em&gt;leads&lt;/em&gt; lainnya menetap di Bay Area sementara sisanya melalangbuana ke Los Angeles.&lt;/p&gt;
&lt;p&gt;Ngapain di Bay Area? Kita berencana mau keliling kantor-kantor &lt;em&gt;tech startup&lt;/em&gt; ternama seperti Google, &lt;s&gt;Apple, Intel, Nasa&lt;/s&gt;, GitHub, Dropbox, Zynga, Airbnb, Pinterest, Heroku dan lain sebagainya.&lt;/p&gt;
&lt;p&gt;Tapi sebelum itu, kita harus &lt;em&gt;checkout&lt;/em&gt; dulu dari hotel masing-masing karena Facebook cuma meng-&lt;em&gt;cover&lt;/em&gt; biaya kita sampai hari ketiga saja. Karena itu kita berlima &lt;em&gt;checkout&lt;/em&gt; dan &lt;em&gt;order&lt;/em&gt; rumah besar dipuncak Alum Rock via &lt;a href=&quot;https://www.airbnb.com/invite?r=50&quot;&gt; Airbnb &lt;/a&gt; 😃.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_PkzGAQa0OgRx9Tt1W1Nm2g-300w.webp 300w, https://rizafahmi.com/img/1_PkzGAQa0OgRx9Tt1W1Nm2g-600w.webp 600w, https://rizafahmi.com/img/1_PkzGAQa0OgRx9Tt1W1Nm2g-960w.webp 960w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_PkzGAQa0OgRx9Tt1W1Nm2g-300w.png&quot; alt=&quot;Mansion at Alum Rock&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;960&quot; height=&quot;720&quot; srcset=&quot;https://rizafahmi.com/img/1_PkzGAQa0OgRx9Tt1W1Nm2g-300w.png 300w, https://rizafahmi.com/img/1_PkzGAQa0OgRx9Tt1W1Nm2g-600w.png 600w, https://rizafahmi.com/img/1_PkzGAQa0OgRx9Tt1W1Nm2g-960w.png 960w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Mansion at Alum Rock&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Menuju Mountain View&lt;/h2&gt;
&lt;p&gt;Rencana utama tur hari pertama ini adalah mengunjungi Intel, Nasa dan Google tentunya. Di &lt;a href=&quot;https://www.intel.com/content/www/us/en/company-overview/intel-museum.html&quot;&gt;Intel&lt;/a&gt; kabarnya ada museum komputer yang keren banget. Nasa juga punya museum yang bisa dikunjungi &lt;a href=&quot;https://www.nasa.gov/ames/visitorcenter.html&quot;&gt;Nasa AMES Research Center&lt;/a&gt; namanya. Apple juga punya &lt;a href=&quot;https://www.apple.com/retail/appleparkvisitorcenter/&quot;&gt;Apple Park Visitor Center&lt;/a&gt; yang layak dikunjungi. Karena keterbatasan waktu dan lokasi kita putuskan ingin mengunjungi museum Nasa dan &lt;a href=&quot;https://en.wikipedia.org/wiki/Googleplex&quot;&gt;Googleplex&lt;/a&gt; saja.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_wAiRBpcSKLkq63jawhok5w-300w.webp 300w, https://rizafahmi.com/img/1_wAiRBpcSKLkq63jawhok5w-600w.webp 600w, https://rizafahmi.com/img/1_wAiRBpcSKLkq63jawhok5w-1024w.webp 1024w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_wAiRBpcSKLkq63jawhok5w-300w.png&quot; alt=&quot;Tram, kereta lambat.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1024&quot; height=&quot;768&quot; srcset=&quot;https://rizafahmi.com/img/1_wAiRBpcSKLkq63jawhok5w-300w.png 300w, https://rizafahmi.com/img/1_wAiRBpcSKLkq63jawhok5w-600w.png 600w, https://rizafahmi.com/img/1_wAiRBpcSKLkq63jawhok5w-1024w.png 1024w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Tram, kereta lambat.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sayangnya ngga keburu juga, museum Nasa sudah keburu tutup. Mungkin karena kita naik tram dan sempat salah turun (&lt;em&gt;my bad&lt;/em&gt;). Kita naik tram dari Alum Rock menuju Downtown Mountain View sebelum bergerak ke Googleplex, kantor Google.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_qFbcT5Ewp_2-wZbPDD-5OA-300w.webp 300w, https://rizafahmi.com/img/1_qFbcT5Ewp_2-wZbPDD-5OA-600w.webp 600w, https://rizafahmi.com/img/1_qFbcT5Ewp_2-wZbPDD-5OA-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_qFbcT5Ewp_2-wZbPDD-5OA-300w.png&quot; alt=&quot;Dari Alum Rock(kiri) ke Mountain View&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;415&quot; srcset=&quot;https://rizafahmi.com/img/1_qFbcT5Ewp_2-wZbPDD-5OA-300w.png 300w, https://rizafahmi.com/img/1_qFbcT5Ewp_2-wZbPDD-5OA-600w.png 600w, https://rizafahmi.com/img/1_qFbcT5Ewp_2-wZbPDD-5OA-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Dari Alum Rock(kiri) ke Mountain View&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ditengah perjalanan kita sempat melewati kantor Samsung dan ketika ganti tram di stasiun, kita sempatkan berfoto-ria.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_ovZjJBDnCK2AITu3jV2S6A-300w.webp 300w, https://rizafahmi.com/img/1_ovZjJBDnCK2AITu3jV2S6A-600w.webp 600w, https://rizafahmi.com/img/1_ovZjJBDnCK2AITu3jV2S6A-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_ovZjJBDnCK2AITu3jV2S6A-300w.png&quot; alt=&quot;Didepan Kantor Samsung&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_ovZjJBDnCK2AITu3jV2S6A-300w.png 300w, https://rizafahmi.com/img/1_ovZjJBDnCK2AITu3jV2S6A-600w.png 600w, https://rizafahmi.com/img/1_ovZjJBDnCK2AITu3jV2S6A-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Didepan Kantor Samsung&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Downtown Mountain View&lt;/h2&gt;
&lt;p&gt;Sesampainya di Downtown Mountain View, perut sudah terasa lapar. Jalanlah kita menyusuri &lt;em&gt;downtown&lt;/em&gt; mencari secercah tempat makan halal. Downtown Mountain View ini unik sekali. Beberapa sudut seperti di film-film Hollywood.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_N_9HUC5jGKVFB_IgefptoA-300w.webp 300w, https://rizafahmi.com/img/1_N_9HUC5jGKVFB_IgefptoA-600w.webp 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_N_9HUC5jGKVFB_IgefptoA-300w.png&quot; alt=&quot;Sudut ini mengingatkan saya kepada satu *scene* di film Spiderman.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;600&quot; height=&quot;450&quot; srcset=&quot;https://rizafahmi.com/img/1_N_9HUC5jGKVFB_IgefptoA-300w.png 300w, https://rizafahmi.com/img/1_N_9HUC5jGKVFB_IgefptoA-600w.png 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Sudut ini mengingatkan saya kepada satu scene di film Spiderman.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_3mmlzOfdE1E2fpSwntptGA-300w.webp 300w, https://rizafahmi.com/img/1_3mmlzOfdE1E2fpSwntptGA-600w.webp 600w, https://rizafahmi.com/img/1_3mmlzOfdE1E2fpSwntptGA-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_3mmlzOfdE1E2fpSwntptGA-300w.png&quot; alt=&quot;Downtown Mountain View&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;350&quot; srcset=&quot;https://rizafahmi.com/img/1_3mmlzOfdE1E2fpSwntptGA-300w.png 300w, https://rizafahmi.com/img/1_3mmlzOfdE1E2fpSwntptGA-600w.png 600w, https://rizafahmi.com/img/1_3mmlzOfdE1E2fpSwntptGA-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Downtown Mountain View&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Kita tidak terlalu banyak melestarikan momen kita disana karena perut sudah semakin lapar. Hingga akhirnya kita menemukan sebuah cafe menarik, namanya &lt;a href=&quot;http://www.cafebaklavamountainview.us/&quot;&gt;Cafe Baklava&lt;/a&gt;. Cafe ini menyuguhi makanan khas mediterania, khususnya Turki. Meskipun panas terik, (kita disana sekitar jam 6–7 malam, disana matahari mulai tenggelam jam 9-an) kita putuskan untuk memilih tempat duduk yang diluar. Keputusan yang salah, pastinya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_UMWXGXW6fl5F-gRi-F5tyw-300w.webp 300w, https://rizafahmi.com/img/1_UMWXGXW6fl5F-gRi-F5tyw-600w.webp 600w, https://rizafahmi.com/img/1_UMWXGXW6fl5F-gRi-F5tyw-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_UMWXGXW6fl5F-gRi-F5tyw-300w.png&quot; alt=&quot;Panas cuy!&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_UMWXGXW6fl5F-gRi-F5tyw-300w.png 300w, https://rizafahmi.com/img/1_UMWXGXW6fl5F-gRi-F5tyw-600w.png 600w, https://rizafahmi.com/img/1_UMWXGXW6fl5F-gRi-F5tyw-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Panas cuy!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Setelah bingung memilih makanan, melihat menu dan di-&lt;em&gt;sort by&lt;/em&gt; harga, kita memilih Lamb Pizza. Setelah menunggu cukup lama akhirnya dan beberapa kali refill air putih, akhirnya makananannya datang juga. Ada yang aneh, kita pesan pizza kok yang muncul roti ya?&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_yDLkglfqX6r39PDSQZsnBA-300w.webp 300w, https://rizafahmi.com/img/1_yDLkglfqX6r39PDSQZsnBA-600w.webp 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_yDLkglfqX6r39PDSQZsnBA-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;600&quot; height=&quot;388&quot; srcset=&quot;https://rizafahmi.com/img/1_yDLkglfqX6r39PDSQZsnBA-300w.png 300w, https://rizafahmi.com/img/1_yDLkglfqX6r39PDSQZsnBA-600w.png 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Roti makanan pembuka&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Karena sudah lapar, apapun yang ada didepan mata kita lahap saja. Rotinya ada kandungan &lt;em&gt;lamb&lt;/em&gt;-nya, rasa-rasanya. Setelah makanan lenyap sekejap mata, dan karena sudah mulai kepanasan, kita langsung beranjak dan bergegas ke Googleplex. Setelah bayar (terimakasih Om Luri sudah mentraktir kita-kita) kita dikagetkan oleh &lt;em&gt;waitress&lt;/em&gt; yang mengabari bahwa pizza yang kita pesan masih dalam proses pembuatan dan dia juga meminta maaf karena sedikit lama. Loh?! Jadi yang tadi kita makan apa dong?!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_xIcFgmNDn2qw-Ibp87c47g-300w.webp 300w, https://rizafahmi.com/img/1_xIcFgmNDn2qw-Ibp87c47g-600w.webp 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_xIcFgmNDn2qw-Ibp87c47g-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;600&quot; height=&quot;443&quot; srcset=&quot;https://rizafahmi.com/img/1_xIcFgmNDn2qw-Ibp87c47g-300w.png 300w, https://rizafahmi.com/img/1_xIcFgmNDn2qw-Ibp87c47g-600w.png 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Lamb Pizza yang sebenarnya&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ternyata yang tadi kita kira roti pizza dengan aroma kambing adalah roti biasa sebagai makanan pembuka! Dan sebenarnya roti itu ngga ada rasa kambingnya sama sekali. Itu murni hanya halusinasi kita saja. Kenyanglah kita tertawa ngakak tiada henti. Dan setelah kenyang (tertawa), dan juga melahap habis pizza-nya, kita bergegas menuju Googleplex.&lt;/p&gt;
&lt;h2&gt;Di Kawasan Googleplex&lt;/h2&gt;
&lt;p&gt;Sesampainya di Googleplex, kita langsung menaiki sepeda yang disediakan Google untuk berkeliling area Googleplex yang super luas! Sepeda ini memang disediakan sebagai kendaraan untuk karyawan Google berkeliling Googleplex. Kabarnya sepeda ini hanya boleh dinaiki oleh karyawan Google. Tapi kita cuek aja dan ternyata ngga ada satpam yang mengejar kita, untungnya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_UAobZXvO_v1GdJwzhwY7wg-300w.webp 300w, https://rizafahmi.com/img/1_UAobZXvO_v1GdJwzhwY7wg-600w.webp 600w, https://rizafahmi.com/img/1_UAobZXvO_v1GdJwzhwY7wg-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_UAobZXvO_v1GdJwzhwY7wg-300w.png&quot; alt=&quot;Sulitnya mengendari sepeda sambil selfie.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_UAobZXvO_v1GdJwzhwY7wg-300w.png 300w, https://rizafahmi.com/img/1_UAobZXvO_v1GdJwzhwY7wg-600w.png 600w, https://rizafahmi.com/img/1_UAobZXvO_v1GdJwzhwY7wg-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Sulitnya mengendari sepeda sambil selfie.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Seperti biasa, kita sempatkan untuk melesarikan momen ini dengan foto-foto. &lt;em&gt;A lot of photos&lt;/em&gt;! Soalnya Googleplex ini cukup &lt;a href=&quot;https://www.instagram.com/rizafahmi/&quot;&gt;instagramable&lt;/a&gt;. Kita foto di patung Android terbaru Oreo (saat artikel ini dipublish mungkin sudah ganti Android P). Dan juga kita foto-foto di &lt;a href=&quot;https://en.wikipedia.org/wiki/Android_lawn_statues&quot;&gt;kuburan Android&lt;/a&gt;, sebuah tempat dimana patung Android yang sudah lewat masanya seperti Donut, Eclair, Jellybean, dll ditempatkan. Sayangnya toko suvenir sudah tutup juga jadi ngga bisa belanja &lt;em&gt;swag&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_SaqUgSzkQPxem2U-9stgHA-300w.webp 300w, https://rizafahmi.com/img/1_SaqUgSzkQPxem2U-9stgHA-600w.webp 600w, https://rizafahmi.com/img/1_SaqUgSzkQPxem2U-9stgHA-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_SaqUgSzkQPxem2U-9stgHA-300w.png&quot; alt=&quot;Bersama maskot Android Oreo&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_SaqUgSzkQPxem2U-9stgHA-300w.png 300w, https://rizafahmi.com/img/1_SaqUgSzkQPxem2U-9stgHA-600w.png 600w, https://rizafahmi.com/img/1_SaqUgSzkQPxem2U-9stgHA-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Bersama maskot Android Oreo&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_o6Jsg-8_AkGXNPXBowUAbQ-300w.webp 300w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_o6Jsg-8_AkGXNPXBowUAbQ-300w.png&quot; alt=&quot;Google Merchandise Store&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;300&quot; height=&quot;300&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Google Merchandise Store&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_bOZh3QzXEZNNIHmHpwtQGg-300w.webp 300w, https://rizafahmi.com/img/1_bOZh3QzXEZNNIHmHpwtQGg-600w.webp 600w, https://rizafahmi.com/img/1_bOZh3QzXEZNNIHmHpwtQGg-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_bOZh3QzXEZNNIHmHpwtQGg-300w.png&quot; alt=&quot;Android Lawn Statues&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_bOZh3QzXEZNNIHmHpwtQGg-300w.png 300w, https://rizafahmi.com/img/1_bOZh3QzXEZNNIHmHpwtQGg-600w.png 600w, https://rizafahmi.com/img/1_bOZh3QzXEZNNIHmHpwtQGg-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Android Lawn Statues&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_5keels7nIe9qqYJsBlgv2w-300w.webp 300w, https://rizafahmi.com/img/1_5keels7nIe9qqYJsBlgv2w-600w.webp 600w, https://rizafahmi.com/img/1_5keels7nIe9qqYJsBlgv2w-960w.webp 960w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_5keels7nIe9qqYJsBlgv2w-300w.png&quot; alt=&quot;Kitkat si pencuci mulut, setelah melahap Lamb Pizza&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;960&quot; height=&quot;1280&quot; srcset=&quot;https://rizafahmi.com/img/1_5keels7nIe9qqYJsBlgv2w-300w.png 300w, https://rizafahmi.com/img/1_5keels7nIe9qqYJsBlgv2w-600w.png 600w, https://rizafahmi.com/img/1_5keels7nIe9qqYJsBlgv2w-960w.png 960w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Jika teman-teman ingin tur kedalam kantornya Google, kita harus punya kontak karyawan Google dan setiap karyawan punya hak untuk memberikan tur hingga kedalam kantor Google. Kebetulan saya mengenal beberapa karyawan Google. Hanya sayangnya pada saat itu para personel Google sedang sibuk mempersiapkan &lt;a href=&quot;https://events.google.com/io/&quot;&gt;Google I/O&lt;/a&gt; sehingga mereka tidak bisa ‘menjamu’ kita untuk tur kedalam kantornya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_KrPupwJzcM43ln3ddAU1UQ-300w.webp 300w, https://rizafahmi.com/img/1_KrPupwJzcM43ln3ddAU1UQ-600w.webp 600w, https://rizafahmi.com/img/1_KrPupwJzcM43ln3ddAU1UQ-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_KrPupwJzcM43ln3ddAU1UQ-300w.png&quot; alt=&quot;Email dari salah satu karyawan Google&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;273&quot; srcset=&quot;https://rizafahmi.com/img/1_KrPupwJzcM43ln3ddAU1UQ-300w.png 300w, https://rizafahmi.com/img/1_KrPupwJzcM43ln3ddAU1UQ-600w.png 600w, https://rizafahmi.com/img/1_KrPupwJzcM43ln3ddAU1UQ-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Email dari salah satu karyawan Google&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Setelah puas berkeliling Googleplex, kita kemudian menuju ke tempat makan sebelum kembali pulang ke penginapan.&lt;/p&gt;
&lt;h2&gt;Golden Gate Bridge&lt;/h2&gt;
&lt;p&gt;Besok paginya kita memulai lagi petualangan kita di Bay Area. Destinasi pertama yang dikunjungi adalah &lt;a href=&quot;https://en.wikipedia.org/wiki/Golden_Gate_Bridge&quot;&gt;Golden Gate Bridge&lt;/a&gt;, itu loh jembatan merah yang terkenal itu.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_PG5LVLdHpny_wFV5Q96ogw-300w.webp 300w, https://rizafahmi.com/img/1_PG5LVLdHpny_wFV5Q96ogw-600w.webp 600w, https://rizafahmi.com/img/1_PG5LVLdHpny_wFV5Q96ogw-828w.webp 828w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_PG5LVLdHpny_wFV5Q96ogw-300w.png&quot; alt=&quot;Adegan golden gate bridge di film x-men.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;828&quot; height=&quot;349&quot; srcset=&quot;https://rizafahmi.com/img/1_PG5LVLdHpny_wFV5Q96ogw-300w.png 300w, https://rizafahmi.com/img/1_PG5LVLdHpny_wFV5Q96ogw-600w.png 600w, https://rizafahmi.com/img/1_PG5LVLdHpny_wFV5Q96ogw-828w.png 828w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Adegan golden gate bridge di film x-men.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_j36Ml1qVMCjvX8uRRpiEfw-300w.webp 300w, https://rizafahmi.com/img/1_j36Ml1qVMCjvX8uRRpiEfw-600w.webp 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_j36Ml1qVMCjvX8uRRpiEfw-300w.png&quot; alt=&quot;Golden Gate saat itu sedang berkabut&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;600&quot; height=&quot;1066&quot; srcset=&quot;https://rizafahmi.com/img/1_j36Ml1qVMCjvX8uRRpiEfw-300w.png 300w, https://rizafahmi.com/img/1_j36Ml1qVMCjvX8uRRpiEfw-600w.png 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Golden Gate saat itu sedang berkabut&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Setelah puas foto-foto dan membeli beberapa merchendise, kemudian kita bergerak menuju San Francisco untuk mengunjungi beberapa kantor-kantor &lt;em&gt;tech company&lt;/em&gt; ternama.&lt;/p&gt;
&lt;h2&gt;Tour de San Francisco&lt;/h2&gt;
&lt;p&gt;Rencana ini agak &lt;em&gt;gambling&lt;/em&gt; sebenarnya. Kalau ngga punya &lt;em&gt;contact person&lt;/em&gt; di &lt;em&gt;tech company&lt;/em&gt; tersebut ngga mungkin bisa masuk ke kantornya. Berhubung sudah terlanjur, ya &lt;em&gt;show must go on&lt;/em&gt;. Jadilah kita menuju ke area perkantoran para startup tersebut.&lt;/p&gt;
&lt;p&gt;Setelah sampai, kita langsung menuju ke kantor &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;. Sayang banget karena tur ke kantor &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt; untuk publik sudah ditiadakan. Ya sudah, kita foto-foto didepan pintunya aja.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_ue18jw-VSjC2hwa0jZTYHA-300w.webp 300w, https://rizafahmi.com/img/1_ue18jw-VSjC2hwa0jZTYHA-600w.webp 600w, https://rizafahmi.com/img/1_ue18jw-VSjC2hwa0jZTYHA-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_ue18jw-VSjC2hwa0jZTYHA-300w.png&quot; alt=&quot;Didepan kantor GitHub&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_ue18jw-VSjC2hwa0jZTYHA-300w.png 300w, https://rizafahmi.com/img/1_ue18jw-VSjC2hwa0jZTYHA-600w.png 600w, https://rizafahmi.com/img/1_ue18jw-VSjC2hwa0jZTYHA-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Didepan kantor GitHub&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Jika ada yang beruntung dapat tur masuk kedalam kantornya, berikut kira-kira &lt;a href=&quot;https://www.officelovin.com/2015/03/20/another-look-inside-githubs-san-francisco-headquarters/&quot;&gt;gambaran bagian dalamnya&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_83k-MVUETA1zPsivcZ21pw-300w.webp 300w, https://rizafahmi.com/img/1_83k-MVUETA1zPsivcZ21pw-600w.webp 600w, https://rizafahmi.com/img/1_83k-MVUETA1zPsivcZ21pw-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_83k-MVUETA1zPsivcZ21pw-300w.png&quot; alt=&quot;Foto diambil dari officelovin.com&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;773&quot; srcset=&quot;https://rizafahmi.com/img/1_83k-MVUETA1zPsivcZ21pw-300w.png 300w, https://rizafahmi.com/img/1_83k-MVUETA1zPsivcZ21pw-600w.png 600w, https://rizafahmi.com/img/1_83k-MVUETA1zPsivcZ21pw-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Foto diambil dari officelovin.com&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Setelah dari &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;, saatnya mengisi perut. Kita kembali mencari tempat makan di sekitar area perkantoran ini. Sambil mencari kita juga melewati kantor &lt;a href=&quot;https://www.ubisoft.com/en-gb/&quot;&gt;Ubisoft&lt;/a&gt;. Perusahaan game asal London ini ternyata punya kantor juga di San Francisco.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_tMLTorv6490bHLlxZ_B4mw-300w.webp 300w, https://rizafahmi.com/img/1_tMLTorv6490bHLlxZ_B4mw-600w.webp 600w, https://rizafahmi.com/img/1_tMLTorv6490bHLlxZ_B4mw-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_tMLTorv6490bHLlxZ_B4mw-300w.png&quot; alt=&quot;Di Depan Kantor Ubisoft&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_tMLTorv6490bHLlxZ_B4mw-300w.png 300w, https://rizafahmi.com/img/1_tMLTorv6490bHLlxZ_B4mw-600w.png 600w, https://rizafahmi.com/img/1_tMLTorv6490bHLlxZ_B4mw-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Di Depan Kantor Ubisoft&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dan berikut tampak dalam kantor Ubisoft seperti yang dirangkum oleh &lt;a href=&quot;https://dynamitedigital.com/large-format-prints-ubisoft-office/&quot;&gt;dynamitedigital.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_v6lFze2pf2Kc1XyHj2UoOQ-300w.webp 300w, https://rizafahmi.com/img/1_v6lFze2pf2Kc1XyHj2UoOQ-600w.webp 600w, https://rizafahmi.com/img/1_v6lFze2pf2Kc1XyHj2UoOQ-1024w.webp 1024w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_v6lFze2pf2Kc1XyHj2UoOQ-300w.png&quot; alt=&quot;Bagian dalam kantor Ubisoft di San Francisco&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1024&quot; height=&quot;613&quot; srcset=&quot;https://rizafahmi.com/img/1_v6lFze2pf2Kc1XyHj2UoOQ-300w.png 300w, https://rizafahmi.com/img/1_v6lFze2pf2Kc1XyHj2UoOQ-600w.png 600w, https://rizafahmi.com/img/1_v6lFze2pf2Kc1XyHj2UoOQ-1024w.png 1024w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Dan juga melewati sebuah stadion yang cukup megah, AT&amp;amp;T Park. Kandang bagi tim Major League Baseball &lt;a href=&quot;https://www.mlb.com/giants&quot;&gt;San Francisco Giants&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_R4fBst5-mC81jIUlSZx-pg-300w.webp 300w, https://rizafahmi.com/img/1_R4fBst5-mC81jIUlSZx-pg-600w.webp 600w, https://rizafahmi.com/img/1_R4fBst5-mC81jIUlSZx-pg-960w.webp 960w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_R4fBst5-mC81jIUlSZx-pg-300w.png&quot; alt=&quot;AT&amp;amp;T Park&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;960&quot; height=&quot;1280&quot; srcset=&quot;https://rizafahmi.com/img/1_R4fBst5-mC81jIUlSZx-pg-300w.png 300w, https://rizafahmi.com/img/1_R4fBst5-mC81jIUlSZx-pg-600w.png 600w, https://rizafahmi.com/img/1_R4fBst5-mC81jIUlSZx-pg-960w.png 960w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Kemudian kita melipir dan makan di &lt;a href=&quot;https://www.umamiburger.com/locations/marina-district/&quot;&gt;Umami Burger&lt;/a&gt;. Kali ini makanannya cukup &lt;em&gt;straightforward&lt;/em&gt;, jadi tidak ada kejadian lucu seperti yang terjadi di Cafe Baklava kemarin. Sambil makan kita juga merencakanan ulang rute perjalanan kita supaya optimal. Karena kita jalan kaki, jadi rute harus super optimal :)&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_5aG9BY_pTckqipdcPl2avA-300w.webp 300w, https://rizafahmi.com/img/1_5aG9BY_pTckqipdcPl2avA-600w.webp 600w, https://rizafahmi.com/img/1_5aG9BY_pTckqipdcPl2avA-960w.webp 960w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_5aG9BY_pTckqipdcPl2avA-300w.png&quot; alt=&quot;Umami Burger di San Francisco&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;960&quot; height=&quot;1280&quot; srcset=&quot;https://rizafahmi.com/img/1_5aG9BY_pTckqipdcPl2avA-300w.png 300w, https://rizafahmi.com/img/1_5aG9BY_pTckqipdcPl2avA-600w.png 600w, https://rizafahmi.com/img/1_5aG9BY_pTckqipdcPl2avA-960w.png 960w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Kemudian petualangan pun dilanjutkan kembali. &lt;em&gt;First stop&lt;/em&gt;, &lt;a href=&quot;https://www.dropbox.com/&quot;&gt;Dropbox&lt;/a&gt;. Kantor &lt;a href=&quot;https://www.dropbox.com/&quot;&gt;Dropbox&lt;/a&gt; agak sedikit berbeda karena gedungnya cukup besar dan ada beberapa gedung dalam satu kompleks.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_G7KfZqNjp__JwK5tLBiOkw-300w.webp 300w, https://rizafahmi.com/img/1_G7KfZqNjp__JwK5tLBiOkw-600w.webp 600w, https://rizafahmi.com/img/1_G7KfZqNjp__JwK5tLBiOkw-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_G7KfZqNjp__JwK5tLBiOkw-300w.png&quot; alt=&quot;Foto kompleks perkantoran Dropbox diambil dari Google Maps&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;536&quot; srcset=&quot;https://rizafahmi.com/img/1_G7KfZqNjp__JwK5tLBiOkw-300w.png 300w, https://rizafahmi.com/img/1_G7KfZqNjp__JwK5tLBiOkw-600w.png 600w, https://rizafahmi.com/img/1_G7KfZqNjp__JwK5tLBiOkw-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Foto kompleks perkantoran Dropbox diambil dari Google Maps&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Kita melihat sepertinya ada sekelompok orang yang baru selesai tur, karena itu kita memberanikan diri untuk bertanya tentang tur ke resepsionis. Ternyata memang tur tidak dilakukan untuk publik. Mungkin mereka adalah sekawanan mahasiswa &lt;em&gt;fresh graduate&lt;/em&gt; atau calon &lt;em&gt;intern&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Tapi kita tidak patah arang, kita tetap diperbolehkan foto didepan kantor yang ada logonya. &lt;em&gt;Fair enough.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_rlW2A7qmoJeBGIlAS2qQJA-300w.webp 300w, https://rizafahmi.com/img/1_rlW2A7qmoJeBGIlAS2qQJA-600w.webp 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_rlW2A7qmoJeBGIlAS2qQJA-300w.png&quot; alt=&quot;Didepan kantor Dropbox&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;600&quot; height=&quot;1066&quot; srcset=&quot;https://rizafahmi.com/img/1_rlW2A7qmoJeBGIlAS2qQJA-300w.png 300w, https://rizafahmi.com/img/1_rlW2A7qmoJeBGIlAS2qQJA-600w.png 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Penasaran dengan tampak dalamnya? Bisa dicek di &lt;a href=&quot;https://www.officelovin.com/2016/12/07/tour-dropboxs-stunning-new-san-francisco-headquarters/&quot;&gt;tautan berikut&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_s2dwh2d_xpiQHdMmZFf1Fg-300w.webp 300w, https://rizafahmi.com/img/1_s2dwh2d_xpiQHdMmZFf1Fg-600w.webp 600w, https://rizafahmi.com/img/1_s2dwh2d_xpiQHdMmZFf1Fg-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_s2dwh2d_xpiQHdMmZFf1Fg-300w.png&quot; alt=&quot;Foto diambil dari situs officelovin.com&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;885&quot; srcset=&quot;https://rizafahmi.com/img/1_s2dwh2d_xpiQHdMmZFf1Fg-300w.png 300w, https://rizafahmi.com/img/1_s2dwh2d_xpiQHdMmZFf1Fg-600w.png 600w, https://rizafahmi.com/img/1_s2dwh2d_xpiQHdMmZFf1Fg-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Foto diambil dari situs officelovin.com&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Selanjutnya kita menuju ke kantor &lt;a href=&quot;https://www.pinterest.com/&quot;&gt;Pinterest&lt;/a&gt;. Kita sudah mencoba menembus barikade &lt;em&gt;front office&lt;/em&gt;-nya dengan pura-pura kebelet dan mau ke toilet. Tapi belum berhasil, alhasil kita cukup foto-foto dari luar kantornya. Oh iya, di San Francisco &lt;a href=&quot;https://www.pinterest.com/&quot;&gt;Pinterest&lt;/a&gt; punya dua kantor yang terpisah 2–3 blok.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_KdlhksT3mVsBB_aEDbeBUQ-300w.webp 300w, https://rizafahmi.com/img/1_KdlhksT3mVsBB_aEDbeBUQ-600w.webp 600w, https://rizafahmi.com/img/1_KdlhksT3mVsBB_aEDbeBUQ-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_KdlhksT3mVsBB_aEDbeBUQ-300w.png&quot; alt=&quot;Foto dari luar kantor Pinterest&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;675&quot; srcset=&quot;https://rizafahmi.com/img/1_KdlhksT3mVsBB_aEDbeBUQ-300w.png 300w, https://rizafahmi.com/img/1_KdlhksT3mVsBB_aEDbeBUQ-600w.png 600w, https://rizafahmi.com/img/1_KdlhksT3mVsBB_aEDbeBUQ-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Foto dari luar kantor Pinterest&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_a9mBHn5HpBQe8hkQVk48Lw-300w.webp 300w, https://rizafahmi.com/img/1_a9mBHn5HpBQe8hkQVk48Lw-600w.webp 600w, https://rizafahmi.com/img/1_a9mBHn5HpBQe8hkQVk48Lw-1000w.webp 1000w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_a9mBHn5HpBQe8hkQVk48Lw-300w.png&quot; alt=&quot;Foto didalam kantor Pinterest. Diambil dari officelovin.com&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1000&quot; height=&quot;665&quot; srcset=&quot;https://rizafahmi.com/img/1_a9mBHn5HpBQe8hkQVk48Lw-300w.png 300w, https://rizafahmi.com/img/1_a9mBHn5HpBQe8hkQVk48Lw-600w.png 600w, https://rizafahmi.com/img/1_a9mBHn5HpBQe8hkQVk48Lw-1000w.png 1000w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Foto didalam kantor Pinterest. Diambil dari officelovin.com&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Kemudian kita berjalan lagi menyusuri kawasan &lt;em&gt;tech company&lt;/em&gt; di San Francisco dan sampailah kita di kantor &lt;a href=&quot;https://www.heroku.com/&quot;&gt;Heroku&lt;/a&gt;. Agak sepi apa mungkin sudah pindah atau memang sudah jam bubaran kantor?! Masih menjadi misteri.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_VS2tcpJHJwL0TjfaVPpn7g-300w.webp 300w, https://rizafahmi.com/img/1_VS2tcpJHJwL0TjfaVPpn7g-600w.webp 600w, https://rizafahmi.com/img/1_VS2tcpJHJwL0TjfaVPpn7g-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_VS2tcpJHJwL0TjfaVPpn7g-300w.png&quot; alt=&quot;Apakah benar ini kantor Heroku?!&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;675&quot; srcset=&quot;https://rizafahmi.com/img/1_VS2tcpJHJwL0TjfaVPpn7g-300w.png 300w, https://rizafahmi.com/img/1_VS2tcpJHJwL0TjfaVPpn7g-600w.png 600w, https://rizafahmi.com/img/1_VS2tcpJHJwL0TjfaVPpn7g-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Apakah benar ini kantor Heroku?!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Jika teman-teman penasaran ingin tahu bagaimana nuansa kantornya, bisa lihat di &lt;a href=&quot;https://www.officelovin.com/2015/06/01/a-tour-of-herokus-gorgeous-san-francisco-headquarters-2/&quot;&gt;link berikut&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_jikJM3nYzLp5GvCPATtFzA-300w.webp 300w, https://rizafahmi.com/img/1_jikJM3nYzLp5GvCPATtFzA-600w.webp 600w, https://rizafahmi.com/img/1_jikJM3nYzLp5GvCPATtFzA-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_jikJM3nYzLp5GvCPATtFzA-300w.png&quot; alt=&quot;Seperti ini kantor Heroku dari dalam. Foto diambil dari officelovin.com&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;828&quot; srcset=&quot;https://rizafahmi.com/img/1_jikJM3nYzLp5GvCPATtFzA-300w.png 300w, https://rizafahmi.com/img/1_jikJM3nYzLp5GvCPATtFzA-600w.png 600w, https://rizafahmi.com/img/1_jikJM3nYzLp5GvCPATtFzA-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Seperti ini kantor Heroku dari dalam. Foto diambil dari officelovin.com&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Perjalanan kita lanjutkan hingga secara tidak sengaja bertemu dengan sebuah gedung yang ditutupi logo anjing lucu. Ya, kita ternyata melewati kantor perusahaan game &lt;a href=&quot;https://www.zynga.com/&quot;&gt;Zynga&lt;/a&gt;! Ternyata itu adalah bagian belakang dari gedung kantornya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_v3iHovK-_cp4An7AeYteRA-300w.webp 300w, https://rizafahmi.com/img/1_v3iHovK-_cp4An7AeYteRA-600w.webp 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_v3iHovK-_cp4An7AeYteRA-300w.png&quot; alt=&quot;Bagian belakang kantor Zynga.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;600&quot; height=&quot;1066&quot; srcset=&quot;https://rizafahmi.com/img/1_v3iHovK-_cp4An7AeYteRA-300w.png 300w, https://rizafahmi.com/img/1_v3iHovK-_cp4An7AeYteRA-600w.png 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Bagian belakang kantor Zynga.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dan selang beberapa langkah kita akhirnya sampai di depan kantornya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_jLKpu_GAwBlidPhU7xBNyg-300w.webp 300w, https://rizafahmi.com/img/1_jLKpu_GAwBlidPhU7xBNyg-600w.webp 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_jLKpu_GAwBlidPhU7xBNyg-300w.png&quot; alt=&quot;Tampak depan kantor Zynga.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;600&quot; height=&quot;1066&quot; srcset=&quot;https://rizafahmi.com/img/1_jLKpu_GAwBlidPhU7xBNyg-300w.png 300w, https://rizafahmi.com/img/1_jLKpu_GAwBlidPhU7xBNyg-600w.png 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tampak depan kantor Zynga.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Kalau teman-teman masuk kedalamnya, wah dijamin keren banget! Mau tahu isi dalemannya seperti apa? Nih bisa &lt;a href=&quot;https://www.officelovin.com/2014/08/14/take-look-zyngas-san-francisco-headquarters/&quot;&gt;diintip disini&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_Aud-85vcK3M5V2x7ve1eJw-300w.webp 300w, https://rizafahmi.com/img/1_Aud-85vcK3M5V2x7ve1eJw-600w.webp 600w, https://rizafahmi.com/img/1_Aud-85vcK3M5V2x7ve1eJw-800w.webp 800w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_Aud-85vcK3M5V2x7ve1eJw-300w.png&quot; alt=&quot;Foto diambil dari officelovin.com&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;576&quot; srcset=&quot;https://rizafahmi.com/img/1_Aud-85vcK3M5V2x7ve1eJw-300w.png 300w, https://rizafahmi.com/img/1_Aud-85vcK3M5V2x7ve1eJw-600w.png 600w, https://rizafahmi.com/img/1_Aud-85vcK3M5V2x7ve1eJw-800w.png 800w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Dan persinggahan terakhir kita di tur &lt;em&gt;tech company&lt;/em&gt; kali ini adalah &lt;a href=&quot;https://www.airbnb.com.sg/invite?r=50&quot;&gt;Airbnb&lt;/a&gt;. Untungnya kantor &lt;a href=&quot;https://www.airbnb.com.sg/invite?r=50&quot;&gt;Airbnb&lt;/a&gt; punya lobby yang dibuka untuk umum, jadi lumayan bisa &lt;em&gt;ngelempengin&lt;/em&gt; kaki disana.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_6aMBCudXLgtcejaVnBkTqQ-300w.webp 300w, https://rizafahmi.com/img/1_6aMBCudXLgtcejaVnBkTqQ-600w.webp 600w, https://rizafahmi.com/img/1_6aMBCudXLgtcejaVnBkTqQ-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_6aMBCudXLgtcejaVnBkTqQ-300w.png&quot; alt=&quot;Ngaso di lobby Airbnb&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_6aMBCudXLgtcejaVnBkTqQ-300w.png 300w, https://rizafahmi.com/img/1_6aMBCudXLgtcejaVnBkTqQ-600w.png 600w, https://rizafahmi.com/img/1_6aMBCudXLgtcejaVnBkTqQ-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Ngaso di lobby Airbnb&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Lucunya, kantor &lt;a href=&quot;https://www.airbnb.com/&quot;&gt;Airbnb&lt;/a&gt; ini ngga ada logonya atau tanda-tanda bahwa ini adalah kantor &lt;a href=&quot;https://www.airbnb.com/&quot;&gt;Airbnb&lt;/a&gt;. Tapi ini bener kok kantor &lt;a href=&quot;https://www.airbnb.com/&quot;&gt;Airbnb&lt;/a&gt;, kita (&lt;a href=&quot;https://www.facebook.com/firdausious?fref=ufi&quot;&gt;Firdaus&lt;/a&gt;) sempat ngobrol dengan salah satu &lt;em&gt;data scientist&lt;/em&gt; &lt;a href=&quot;https://www.airbnb.com/&quot;&gt;Airbnb&lt;/a&gt; yang ternyata berasal dari negeri tetangga, Malaysia. Dan dia juga baru sadar kantornya ngga ada logonya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_a8wvg8F4g0tsPFvWVsHVGw-300w.webp 300w, https://rizafahmi.com/img/1_a8wvg8F4g0tsPFvWVsHVGw-600w.webp 600w, https://rizafahmi.com/img/1_a8wvg8F4g0tsPFvWVsHVGw-900w.webp 900w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_a8wvg8F4g0tsPFvWVsHVGw-300w.png&quot; alt=&quot;Atrium kantor Airbnb. Foto diambil dari officelovin.com&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;900&quot; height=&quot;600&quot; srcset=&quot;https://rizafahmi.com/img/1_a8wvg8F4g0tsPFvWVsHVGw-300w.png 300w, https://rizafahmi.com/img/1_a8wvg8F4g0tsPFvWVsHVGw-600w.png 600w, https://rizafahmi.com/img/1_a8wvg8F4g0tsPFvWVsHVGw-900w.png 900w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Dan selesai sudah tur &lt;em&gt;tech company&lt;/em&gt; kita. Tapi sebelum pulang ke penginapan, kita menyempatkan untuk mengunjungi daerah pantai San Francisco, &lt;a href=&quot;https://www.pier39.com/&quot;&gt;Pier 39&lt;/a&gt; dan &lt;a href=&quot;https://en.wikipedia.org/wiki/Fisherman%27s_Wharf,_San_Francisco&quot;&gt;Fisherman’s Wharf&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Pier 39 dan Fisherman’s Wharf&lt;/h2&gt;
&lt;p&gt;Pier 39 ini seperti ‘ancol’-nya San Francisco. Cukup ramai pengunjung, salah satu daya tariknya adalah pemandangan yang sangat indah. Kita bisa melihat sisi lain kota San Francisco dari sini.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_0pvn0EyDqKTnQt44eprxAg-300w.webp 300w, https://rizafahmi.com/img/1_0pvn0EyDqKTnQt44eprxAg-600w.webp 600w, https://rizafahmi.com/img/1_0pvn0EyDqKTnQt44eprxAg-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_0pvn0EyDqKTnQt44eprxAg-300w.png&quot; alt=&quot;Sisi lain San Francisco&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_0pvn0EyDqKTnQt44eprxAg-300w.png 300w, https://rizafahmi.com/img/1_0pvn0EyDqKTnQt44eprxAg-600w.png 600w, https://rizafahmi.com/img/1_0pvn0EyDqKTnQt44eprxAg-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Sisi lain San Francisco&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Kita juga bisa menyaksikan sebuah penjara ditengah pulau, &lt;a href=&quot;https://en.wikipedia.org/wiki/Alcatraz_Island&quot;&gt;Alcatraz&lt;/a&gt;. Penggemar film x-men pasti tahu penjara seperti apa Alcatraz itu. Bahkan kita bisa mengunjungi pulau tersebut dengan menggunakan kapal feri dari Pier 39 ini.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_QoAYHSkzQi1t9fCvl5-yOg-300w.webp 300w, https://rizafahmi.com/img/1_QoAYHSkzQi1t9fCvl5-yOg-600w.webp 600w, https://rizafahmi.com/img/1_QoAYHSkzQi1t9fCvl5-yOg-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_QoAYHSkzQi1t9fCvl5-yOg-300w.png&quot; alt=&quot;Alcatraz dari kejauhan&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;675&quot; srcset=&quot;https://rizafahmi.com/img/1_QoAYHSkzQi1t9fCvl5-yOg-300w.png 300w, https://rizafahmi.com/img/1_QoAYHSkzQi1t9fCvl5-yOg-600w.png 600w, https://rizafahmi.com/img/1_QoAYHSkzQi1t9fCvl5-yOg-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Alcatraz dari kejauhan&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dan pemandangan terakhir yang bisa kita saksikan adalah singa laut yang sedang berjemur jika musim panas tiba.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_qkJn9ntAhWmbAlqqL95SIw-300w.webp 300w, https://rizafahmi.com/img/1_qkJn9ntAhWmbAlqqL95SIw-600w.webp 600w, https://rizafahmi.com/img/1_qkJn9ntAhWmbAlqqL95SIw-960w.webp 960w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_qkJn9ntAhWmbAlqqL95SIw-300w.png&quot; alt=&quot;Singa laut sedang berjemur.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;960&quot; height=&quot;720&quot; srcset=&quot;https://rizafahmi.com/img/1_qkJn9ntAhWmbAlqqL95SIw-300w.png 300w, https://rizafahmi.com/img/1_qkJn9ntAhWmbAlqqL95SIw-600w.png 600w, https://rizafahmi.com/img/1_qkJn9ntAhWmbAlqqL95SIw-960w.png 960w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Setelah bergaya menjadi model dadakan disekitar sini, karena memang pemandangannya sangat, sangat indah, kemudian kita sempatkan juga mencari suvenir buat oleh-oleh sebelum akhirnya pulang ke penginapan.&lt;/p&gt;
&lt;p&gt;Sampai dirumah, istirahat dan waktunya mengisi perut. Setelah berjalan-jalan ditempat yang cukup &lt;em&gt;fancy&lt;/em&gt; dan makan siang ditempat yang &lt;em&gt;fancy&lt;/em&gt; juga. Coba tebak makan malam kita apa? Buat yang penasaran, bisa cek video berikut hasil rekaman Pak &lt;a href=&quot;https://www.facebook.com/masbamsby&quot;&gt;Bambang Wahyudi&lt;/a&gt;.&lt;/p&gt;
&lt;video controls=&quot;&quot;&gt;
 &lt;source src=&quot;https://rizafahmi.com/assets/images/f83/Bambang.mp4&quot; type=&quot;video/mp4&quot; /&gt;
 Your browser does not support video.
&lt;/video&gt;
&lt;p&gt;Dengan demikian berakhir sudah perjalanan ke Silicon Valley kali ini. Kritik dan saran silakan dikirimkan via merpati pos 🕊️. Jika ingin mendengarkan laporan perjalanan saya ke kota-kota lainnya, &lt;a href=&quot;mailto:rizafahmi@gmail.com&quot;&gt;silakan sponsori saya untuk tiket pesawat dengan segala akomodasinya&lt;/a&gt; 😈. Sampai bertemu di lain kesempatan.&lt;/p&gt;
&lt;p&gt;Terimakasih banyak saya ucapkan untuk komunitas &lt;a href=&quot;https://www.facebook.com/groups/DevCJakarta/&quot;&gt;facebook DevC Jakarta&lt;/a&gt; karena tanpa kalian kita para &lt;em&gt;leads&lt;/em&gt; tidak akan mendapatkan kesempatan langka ini. Terimakasih juga untuk &lt;a href=&quot;https://facebook.com/rizafahmi&quot;&gt;Facebook&lt;/a&gt; yang sudah mensponsori kita untuk tiket, akomodasi dan acara-acara keren selama disana. Dan tak lupa juga terimakasih banyak &lt;a href=&quot;https://hacktiv8.com/&quot;&gt;Hacktiv8&lt;/a&gt; untuk waktu dan uang sakunya :)&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>F8 Silicon Valley Trip Day 2</title>
    <link href="https://rizafahmi.com/2018/05/21/f8-san-jose-trip-day-2/"/>
    <updated>2018-05-21T00:00:00Z</updated>
    <pubDate>2018-05-21T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2018/05/21/f8-san-jose-trip-day-2/</id>
    <summary>Ini adalah cerita berseri tentang perjalanan saya dan teman-teman Facebook Developer Circle Leads ke Silicon Valley dalam rangka mengikuti Facebook F8 Developer Conference. Ikuti dari bagian 0 , dan bagian 1 supaya…</summary>
    <category term="catatan, komunitas, konferensi, travel"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/f8-silicon-valley-day-2.png"/>
    <content type="html">&lt;p&gt;Ini adalah cerita berseri tentang perjalanan saya dan teman-teman Facebook Developer Circle Leads ke Silicon Valley dalam rangka mengikuti Facebook F8 Developer Conference. Ikuti dari &lt;a href=&quot;https://rizafahmi.com/2018/05/08/f8-san-jose-trip-day-0/&quot;&gt; bagian 0 &lt;/a&gt;, dan &lt;a href=&quot;https://rizafahmi.com/2018/05/14/f8-san-jose-trip-day-1/&quot;&gt; bagian 1 &lt;/a&gt; supaya mendapatkan jalan ceritanya secara keseluruhan.&lt;/p&gt;
&lt;p&gt;Tidak mau salah strategi lagi, F8 hari kedua saya fokuskan untuk menyaksikan berbagai &lt;em&gt;talk&lt;/em&gt; yang menarik. Satu hal menarik yang saya perhatikan dari &lt;em&gt;conference&lt;/em&gt; ini adalah setiap habis sesi talk, speaker &lt;em&gt;mojok&lt;/em&gt; disisi kiri atau kanan panggung dan menantikan beberapa &lt;em&gt;audience&lt;/em&gt; yang mau bertegur sapa dan bertanya. Ini hal baru buat saya, terutama &lt;em&gt;conference&lt;/em&gt; di Indonesia belum pernah saya melihat hal seperti ini dilakukan. Dan &lt;em&gt;audience&lt;/em&gt; juga cukup sopan untuk antri dan bergantian menyapa para pembicara.&lt;/p&gt;
&lt;h2&gt;Keynote Hari Kedua&lt;/h2&gt;
&lt;p&gt;Kembali, jet lag menyerang. Banyak momen terlewat karena tidak tahan menahan kantuk. Untungnya ngga sampai &lt;em&gt;ngorok&lt;/em&gt; seperti orang yang berada dua &lt;em&gt;row&lt;/em&gt; dari saya 😈. Untuk hari kedua ini keynote dibawakan oleh Chief Technology Officer Facebook, Mike Schroepfer dan beberapa petinggi Facebook lainnya memaparkan tentang teknologi dan inovasi terkini yang dilakukan Facebook.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_kGLsZ2WXzljMjkMhh2fIBQ-300w.webp 300w, https://rizafahmi.com/img/1_kGLsZ2WXzljMjkMhh2fIBQ-600w.webp 600w, https://rizafahmi.com/img/1_kGLsZ2WXzljMjkMhh2fIBQ-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_kGLsZ2WXzljMjkMhh2fIBQ-300w.png&quot; alt=&quot;Talk by CTO Facebook Mike Schroepfer&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_kGLsZ2WXzljMjkMhh2fIBQ-300w.png 300w, https://rizafahmi.com/img/1_kGLsZ2WXzljMjkMhh2fIBQ-600w.png 600w, https://rizafahmi.com/img/1_kGLsZ2WXzljMjkMhh2fIBQ-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Talk by CTO Facebook Mike Schroepfer&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Berbeda dengan hari pertama, kali ini saya duduk agak dibelakang karena sedikit telat pada saat masuk ke arena. Dari talk Mike diatas saya baru tersadar bahwa di Facebook, AI sudah digunakan dimana-mana. &lt;em&gt;AI is everywhere&lt;/em&gt;! Ya ampun, saya yang sempat memilih mata kuliah AI dulu waktu di Binus menyia-nyiakan ilmu yang sebenarnya sudah saya ketahui dari dulu, dari tahun 2002-2003. Selaras yang dikatakan &lt;a href=&quot;https://rizafahmi.com/2018/05/14/f8-silicon-valley-trip-day-1/&quot;&gt;Eric Nakagawa&lt;/a&gt; yang saya jabarkan di artikel sebelumnya. Saya harus segera &lt;em&gt;upgrade&lt;/em&gt; ilmu nih!&lt;/p&gt;
&lt;p&gt;Beberapa catatan penting lainnya:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pytorch.org/&quot;&gt;PyTorch&lt;/a&gt;, sebuah library Machine Learning rilis versi 1.0.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://caffe2.ai/&quot;&gt;Caffe2&lt;/a&gt;, sebuah library deep learning juga dirilis.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://onnx.ai/&quot;&gt;ONNX&lt;/a&gt;, sebuah open platform untuk deep learning model juga dirilis. Hal ini memungkinkan beberapa platform sepert Amazon AWS, Microsoft Azure dan yang lainnya bisa saling berkolaborasi menghasilkan model yang lebih powerful.&lt;/li&gt;
&lt;li&gt;Sebuah web juga dirilis, khusus untuk pengembang AI &lt;a href=&quot;https://facebook.ai/developers&quot;&gt;https://facebook.ai/developers&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Secara umum visi Facebook sepuluh tahun kedepan adalah AI, Connectivity, VR dan AR. Berikut &lt;a href=&quot;https://developers.facebook.com/videos/f8-2018/f8-2018-day-2-keynote/&quot;&gt;link videonya&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Beberapa Talk Menarik&lt;/h2&gt;
&lt;p&gt;Sehari sebelumnya saya sudah planning untuk menyaksikan talk-talk berikut:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Duckling: An Overview of the Open Source Probabilistic Parser&lt;/li&gt;
&lt;li&gt;&lt;s&gt;Using Natural Language Processing to Enhance Your Messenger Conversations&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;Build Your First Messenger Instant Game&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;How React Native Helps Companies Build Better Mobile Apps&lt;/li&gt;
&lt;li&gt;Building with React Native and React VR: Insights from Instagram and Oculus&lt;/li&gt;
&lt;li&gt;&lt;s&gt;How Camera Effects Helped Us to Grow Our Business&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;Audio and Speech Understanding System&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;Investing in Innovators Through Developer Programs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tapi tidak semua akhirnya bisa saya hadiri karena satu dan lain hal. &lt;em&gt;Talk&lt;/em&gt; pertama yang saya hadiri adalah tentang library &lt;a href=&quot;https://github.com/facebook/duckling&quot;&gt;Duckling&lt;/a&gt;. Sebuah library Haskell yang bisa mem-&lt;em&gt;parsing&lt;/em&gt; text menjadi data yang lebih terstruktur seperti tanggal dan lainnya. Sayangnya &lt;em&gt;pace&lt;/em&gt;-nya agak cepat sehingga saya ketinggalan. Dan juga karena koneksi internet yang cukup mengecewakan sehingga keinginan belajar Haskell berhenti ketika gagal menginstal package &lt;a href=&quot;https://docs.haskellstack.org/en/stable/README/&quot;&gt;haskell-stack&lt;/a&gt;. Haha, alasan aja ini mah 😏.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_pjoseGiSS_VOq1dt3CrP2g-300w.webp 300w, https://rizafahmi.com/img/1_pjoseGiSS_VOq1dt3CrP2g-600w.webp 600w, https://rizafahmi.com/img/1_pjoseGiSS_VOq1dt3CrP2g-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_pjoseGiSS_VOq1dt3CrP2g-300w.png&quot; alt=&quot;Install Haskell Stack gagal&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_pjoseGiSS_VOq1dt3CrP2g-300w.png 300w, https://rizafahmi.com/img/1_pjoseGiSS_VOq1dt3CrP2g-600w.png 600w, https://rizafahmi.com/img/1_pjoseGiSS_VOq1dt3CrP2g-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Install Haskell Stack gagal&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;React Native Panel Discussion&lt;/h2&gt;
&lt;p&gt;Kemudian saya menghadiri diskusi panel tentang React Native yang di moderatori oleh &lt;a href=&quot;https://twitter.com/ericnakagawa&quot;&gt;Eric Nakagawa&lt;/a&gt;. Panel terdiri dari &lt;a href=&quot;https://twitter.com/ginatrapani&quot;&gt;Gina Trapani&lt;/a&gt; Director of Engineering at &lt;a href=&quot;https://postlight.com/&quot;&gt;Postlight&lt;/a&gt;, &lt;a href=&quot;https://github.com/sophiebits&quot;&gt;Sophie Alpert&lt;/a&gt; Engineering Manager at Facebok, &lt;a href=&quot;https://twitter.com/bleonard?lang=en&quot;&gt;Brian Leonard&lt;/a&gt; CTO at &lt;a href=&quot;https://www.taskrabbit.com/&quot;&gt;TaskRabbit&lt;/a&gt;, &lt;a href=&quot;https://www.linkedin.com/in/apotra/&quot;&gt;Adrian Potra&lt;/a&gt; Engineering Manager at &lt;a href=&quot;https://www.skype.com/en/&quot;&gt;Skype&lt;/a&gt;, dan &lt;a href=&quot;https://twitter.com/kentonjacobsen?lang=en&quot;&gt;Kenton Jacobsen&lt;/a&gt; Director of Engineering at &lt;a href=&quot;https://www.vogue.com/&quot;&gt;Vogue&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_zLCDavSW83EPIT-lAietKA-300w.webp 300w, https://rizafahmi.com/img/1_zLCDavSW83EPIT-lAietKA-600w.webp 600w, https://rizafahmi.com/img/1_zLCDavSW83EPIT-lAietKA-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_zLCDavSW83EPIT-lAietKA-300w.png&quot; alt=&quot;ReactNative Discussion Panel&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_zLCDavSW83EPIT-lAietKA-300w.png 300w, https://rizafahmi.com/img/1_zLCDavSW83EPIT-lAietKA-600w.png 600w, https://rizafahmi.com/img/1_zLCDavSW83EPIT-lAietKA-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;ReactNative Discussion Panel&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Seperti yang sudah bisa ditebak, Postlight, Facebook, TaskRabbit, Skype dan Vogue semua menggunakan ReactNative di &lt;em&gt;production&lt;/em&gt;. Berikut beberapa catatan yang saya dapat dari diskusi panel ini:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Skype mengunakan &lt;a href=&quot;https://facebook.github.io/react-native/&quot;&gt;ReactNative&lt;/a&gt; dengan &lt;a href=&quot;https://www.typescriptlang.org/&quot;&gt;TypeScript&lt;/a&gt;. Mereka menggunakan &lt;a href=&quot;https://reactjs.org/&quot;&gt;React&lt;/a&gt; dan ReactNative untuk &lt;em&gt;solve cross-platform issue&lt;/em&gt;. Mereka juga menggunakan &lt;a href=&quot;https://github.com/Microsoft/reactxp&quot;&gt;ReactXP&lt;/a&gt;. Untuk hiring, mereka lebih fokus kepada orang-orang dengan tipe generalis.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TaskRabbit pertama kali menggunakan ReactNative di aplikasi Tasker mereka. Yang tadinya tim mobile disemua platform ada enam orang, setelah menggunakan ReactNative, timnya bisa dipangkas menjadi 2 orang saja!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vogue menggunakan ReactNative dan &lt;a href=&quot;https://graphql.org/&quot;&gt;GraphQL&lt;/a&gt;. Di Backend Vogue menggunakan &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;NodeJS&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Facebook menggunakan ReactNative dimana-mana. Yang paling besar salah satunya di Facebook Marketplace yang diakses 800 juta orang per bulannya.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PostLight menggunakan React sangat intensif di web dan mereka hanya punya 1 orang iOS engineer. Dan memilih ReactNative merupakan pilihan yang &lt;em&gt;no brainer&lt;/em&gt; buat PostLight. Terutama karena mereka juga banyak bekerjasama dengan instansi-instansi non-profit dengan budget minimal&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Setelah diskusi selesai, saya melihat semua narasumber turun dari panggung dan menunggu di sisi panggung untuk &lt;em&gt;disamperin&lt;/em&gt; audience. Dan &lt;em&gt;audience&lt;/em&gt; juga membentuk antrian yang rapi dan bergantian bertanya atau sekedar &lt;em&gt;say hi&lt;/em&gt;. Karena kemaren sudah berbincang banyak dengan Eric, saya memutuskan untuk &lt;em&gt;say hi&lt;/em&gt; ke &lt;a href=&quot;https://ginatrapani.org/&quot;&gt;Gina Trapani&lt;/a&gt;. Buat yang belum tahu, Gina ini cukup populer dimasanya. Dia pembuat aplikasi &lt;a href=&quot;http://todotxt.org/&quot;&gt;todo.txt&lt;/a&gt;, ex-founder &lt;a href=&quot;https://lifehacker.com/&quot;&gt;lifehacker&lt;/a&gt;, pengisi acara di &lt;a href=&quot;https://twit.tv/episodes?credits_people=23&quot;&gt;twit.tv&lt;/a&gt;, dan masih banyak lagi.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_uydj0iEZdDV4YwlIJROfjA-300w.webp 300w, https://rizafahmi.com/img/1_uydj0iEZdDV4YwlIJROfjA-600w.webp 600w, https://rizafahmi.com/img/1_uydj0iEZdDV4YwlIJROfjA-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_uydj0iEZdDV4YwlIJROfjA-300w.png&quot; alt=&quot;With Gina Trapani&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_uydj0iEZdDV4YwlIJROfjA-300w.png 300w, https://rizafahmi.com/img/1_uydj0iEZdDV4YwlIJROfjA-600w.png 600w, https://rizafahmi.com/img/1_uydj0iEZdDV4YwlIJROfjA-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;With Gina Trapani&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;ReactNative Dan ReactVR di Instagram dan Oculus&lt;/h2&gt;
&lt;p&gt;Talk selanjutnya yang saya hadiri berjudul “Building with React Native and React VR: Insights from Instagram and Oculus”. Dibawakan duet oleh &lt;a href=&quot;https://www.instagram.com/brosenfeld/?hl=en&quot;&gt;Brian Rosenfeld&lt;/a&gt; dari &lt;a href=&quot;https://instagram.com/&quot;&gt;Instagram&lt;/a&gt; dan Mike Armstrong dari &lt;a href=&quot;https://www.oculus.com/&quot;&gt;Oculus&lt;/a&gt;, mereka share apa dan bagaiman ReactNative dan ReactVR digunakan di perusahaan masing-masing.&lt;/p&gt;
&lt;p&gt;Inti dari sesi ini adalah meskipun Instagram dan Oculus berasal dari dunia yang berbeda, yang satu adalah aplikasi mobile dan web dan lainnya mengembangkan platform virtual reality, tapi mereka menggunakan &lt;em&gt;framework&lt;/em&gt; yang sama, React (padahal katanya React bukan framework ya, ya sudahlah).&lt;/p&gt;
&lt;p&gt;Di sesi ini sebenarnya mereka ‘jualan’ React sih dengan menjelaskan apa itu React, apa itu ReactNative dan ReactVR. Dan buat saya yang sudah menggunakan React, saya tidak perlu di-&lt;em&gt;convince&lt;/em&gt; lagi sih. Tapi presentasinya cukup menghibur dan mendapatkan &lt;em&gt;insight&lt;/em&gt; tambahan kenapa React itu keren!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_uBrvNLqvOB-MVKznzTcRXw-300w.webp 300w, https://rizafahmi.com/img/1_uBrvNLqvOB-MVKznzTcRXw-600w.webp 600w, https://rizafahmi.com/img/1_uBrvNLqvOB-MVKznzTcRXw-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_uBrvNLqvOB-MVKznzTcRXw-300w.png&quot; alt=&quot;Sesi ReactNative dan ReactVR&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_uBrvNLqvOB-MVKznzTcRXw-300w.png 300w, https://rizafahmi.com/img/1_uBrvNLqvOB-MVKznzTcRXw-600w.png 600w, https://rizafahmi.com/img/1_uBrvNLqvOB-MVKznzTcRXw-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Sesi ReactNative dan ReactVR&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Investing in Innovators Through Developer Programs&lt;/h3&gt;
&lt;p&gt;Dan sesi terakhir yang saya hadiri adalah sesi Developer Programs. Disini Kunbi Adeyemo dari Facebook sharing tentang bagaimana program Developer Circles mengubah hidup banyak orang. Salah satunya, &lt;a href=&quot;https://www.facebook.com/nilawilda&quot;&gt;Nila&lt;/a&gt; DevC Lead asal Surabaya. Tuh, slide-nya saya foto! Merinding episode kedua 😃.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_qQi_vvtayQxkE3-ssIAl2Q-300w.webp 300w, https://rizafahmi.com/img/1_qQi_vvtayQxkE3-ssIAl2Q-600w.webp 600w, https://rizafahmi.com/img/1_qQi_vvtayQxkE3-ssIAl2Q-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_qQi_vvtayQxkE3-ssIAl2Q-300w.png&quot; alt=&quot;Nila on the slide&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_qQi_vvtayQxkE3-ssIAl2Q-300w.png 300w, https://rizafahmi.com/img/1_qQi_vvtayQxkE3-ssIAl2Q-600w.png 600w, https://rizafahmi.com/img/1_qQi_vvtayQxkE3-ssIAl2Q-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Nila on the slide&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Luar biasa ya kontingen Indonesia banyak di-&lt;em&gt;highlight&lt;/em&gt;. Dan satu hal lagi yang baru saya tahu ternyata salah satu founder aplikasi belajar coding &lt;a href=&quot;https://developers.facebook.com/videos/f8-2018/investing-in-innovators-through-developer-programs/&quot;&gt;SoloLearn&lt;/a&gt;, &lt;a href=&quot;https://www.linkedin.com/in/yeva-hyusyan-5a16a220/&quot;&gt;Yeva Hyusyan&lt;/a&gt; juga hasil ‘didikan’ Developer Program di Armenia.&lt;/p&gt;
&lt;p&gt;Dan selesai sudah sesi-sesi &lt;em&gt;talk&lt;/em&gt; dan sekaligus F8 ditutup dengan Happy Hour sekaligus pengumuman pemenang Hackathon. Karena saya ngga ikutan, saya dan beberapa &lt;em&gt;leads&lt;/em&gt; memutuskan pulang ke hotel untuk isitirahat sejenak karena malamnya ada acara khusus untuk &lt;em&gt;leads&lt;/em&gt;. Seperti acara pembubaran panitia gitu deh.&lt;/p&gt;
&lt;h2&gt;Happy Hour For DevC Leads&lt;/h2&gt;
&lt;p&gt;Nah, &lt;em&gt;another great moment came at this event&lt;/em&gt;. Setelah makan, minum, saling bertegur sapa, dan foto-foto (sumpah, para leads disini banyak banget yang hobi selfie!) saya mendapatkan momen yang sangat berharga meski sebentar.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_HDGD81BS3J24_PgSn8gefQ-300w.webp 300w, https://rizafahmi.com/img/1_HDGD81BS3J24_PgSn8gefQ-600w.webp 600w, https://rizafahmi.com/img/1_HDGD81BS3J24_PgSn8gefQ-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_HDGD81BS3J24_PgSn8gefQ-300w.png&quot; alt=&quot;Maaf, saya kurang bisa wefie.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_HDGD81BS3J24_PgSn8gefQ-300w.png 300w, https://rizafahmi.com/img/1_HDGD81BS3J24_PgSn8gefQ-600w.png 600w, https://rizafahmi.com/img/1_HDGD81BS3J24_PgSn8gefQ-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Maaf, saya kurang bisa wefie.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_Dvj3KZGNDswBIHZrlmpSUA-300w.webp 300w, https://rizafahmi.com/img/1_Dvj3KZGNDswBIHZrlmpSUA-600w.webp 600w, https://rizafahmi.com/img/1_Dvj3KZGNDswBIHZrlmpSUA-960w.webp 960w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_Dvj3KZGNDswBIHZrlmpSUA-300w.png&quot; alt=&quot;With Leads, mother of Leads (Elisha) and Mother of mother of Leads (Alice).&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;960&quot; height=&quot;720&quot; srcset=&quot;https://rizafahmi.com/img/1_Dvj3KZGNDswBIHZrlmpSUA-300w.png 300w, https://rizafahmi.com/img/1_Dvj3KZGNDswBIHZrlmpSUA-600w.png 600w, https://rizafahmi.com/img/1_Dvj3KZGNDswBIHZrlmpSUA-960w.png 960w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;With Leads, mother of Leads (Elisha) and Mother of mother of Leads (Alice).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Moment of truth&lt;/em&gt;, atas inisiasi bro Firdaus, DevC Lead Surabaya saya dikenalkan oleh orang yang keren parah! Dia sangat terkenal di dunia p̶e̶r̶s̶i̶l̶a̶t̶a̶n̶ ReactNative. Tapi karena orangnya &lt;em&gt;low profile&lt;/em&gt; dan &lt;em&gt;super geek&lt;/em&gt;, ngga banyak orang yang tahu. Namanya &lt;a href=&quot;https://twitter.com/FaridSafi&quot;&gt;Farid Safi&lt;/a&gt;, DevC Lead Paris. Dia ini &lt;em&gt;master&lt;/em&gt;-nya ReactNative. Kalo tahu ReactNative pasti tahu &lt;a href=&quot;https://github.com/FaridSafi/react-native-gifted-chat&quot;&gt;Gifted Chat&lt;/a&gt;, salah satu project ReactNative yang jadi panduan banyak orang saat belajar. Dan yang Farid ini adalah orang yang buat Gifted Chat. Ya ampun, kenapa baru sempat ngobrol sekarang ya….&lt;/p&gt;
&lt;p&gt;Dan yang lebih kerennya lagi adalah Farid ini juga membangun &lt;em&gt;coding bootcamp&lt;/em&gt; di Paris. Namanya&lt;a href=&quot;https://www.lereacteur.io/&quot;&gt;Le Reacteur&lt;/a&gt;, sebuah &lt;em&gt;coding bootcamp fullstack&lt;/em&gt; JavaScript yang berdurasi 10 minggu. Jadilah kita saling &lt;em&gt;sharing&lt;/em&gt; tentang bagaimana suka-duka menjalankan &lt;em&gt;bootcamp&lt;/em&gt;. Termasuk saya juga bertanya tentang &lt;em&gt;bootcamp&lt;/em&gt; lainnya yang saya tahu dan sepertinya lebih populer: &lt;a href=&quot;https://www.lewagon.com/&quot;&gt;Le Wagon&lt;/a&gt;. Dan memang benar dugaan saya, mereka kompetitor. Dan saya bisa merasakan gimana rasanya punya kompetitor 😃.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_ScFO7DsZZOrqvJVsHJ_4qg-300w.webp 300w, https://rizafahmi.com/img/1_ScFO7DsZZOrqvJVsHJ_4qg-600w.webp 600w, https://rizafahmi.com/img/1_ScFO7DsZZOrqvJVsHJ_4qg-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_ScFO7DsZZOrqvJVsHJ_4qg-300w.png&quot; alt=&quot;With Farid&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_ScFO7DsZZOrqvJVsHJ_4qg-300w.png 300w, https://rizafahmi.com/img/1_ScFO7DsZZOrqvJVsHJ_4qg-600w.png 600w, https://rizafahmi.com/img/1_ScFO7DsZZOrqvJVsHJ_4qg-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;With Farid&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sayangnya waktu kita terbatas, jadi cuma sempat ngobrol sebentar. Tapi tenang saja, kita bisa ngobrol &lt;em&gt;online&lt;/em&gt; kan ya. Yang penting kontak sudah didapat 🎉.&lt;/p&gt;
&lt;p&gt;Dan usai sudah perhelatan &lt;a href=&quot;https://www.f8.com/&quot;&gt;F8 Conference&lt;/a&gt;. Mungkin artikel selanjutnya saya akan share sedikit tentang pengalaman saya dan teman-teman leads mengelilingi Silicon Valley dalam rangka tur ke kantor-kantor startup ternama.&lt;/p&gt;
&lt;p&gt;Kalau mau dengar penuturan langsung dari kami yang berangkat, silakan join &lt;a href=&quot;https://www.facebook.com/groups/DevCJakarta/&quot;&gt;grup facebook DevC Jakarta&lt;/a&gt;. Kita akan mengadakan meetup khusus membahas tentang pengalaman kita di F8.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>F8 Silicon Valley Trip Day 1</title>
    <link href="https://rizafahmi.com/2018/05/14/f8-san-jose-trip-day-1/"/>
    <updated>2018-05-14T00:00:00Z</updated>
    <pubDate>2018-05-14T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2018/05/14/f8-san-jose-trip-day-1/</id>
    <summary>Ini adalah cerita berseri tentang perjalanan saya dan teman-teman Facebook Developer Circle Leads ke Silicon Valley dalam rangka mengikuti Facebook F8 Developer Conference. Ikuti dari bagian 0 supaya mendapatkan jalan…</summary>
    <category term="catatan, komunitas, konferensi, travel"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/og/f8-silicon-valley-trip-day-1.png"/>
    <content type="html">&lt;p&gt;Ini adalah cerita berseri tentang perjalanan saya dan teman-teman Facebook Developer Circle Leads ke Silicon Valley dalam rangka mengikuti Facebook F8 Developer Conference. Ikuti dari bagian 0 supaya mendapatkan jalan ceritanya secara keseluruhan.&lt;/p&gt;
&lt;p&gt;Sampailah kita di acara utama &lt;a href=&quot;https://f8.com/&quot;&gt;F8 Conference&lt;/a&gt; day 1! Di hari pertama ini cukup banyak yang bisa di-&lt;em&gt;highlight&lt;/em&gt;. Meskipun agak salah strategi sehingga di hari pertama ini banyak sekali melewatkan &lt;em&gt;talk-talk&lt;/em&gt; keren, salah satunya &lt;em&gt;talk&lt;/em&gt; tentang Jest yang dibawakan oleh &lt;a href=&quot;https://twitter.com/aarondjents&quot;&gt; Aaron Abramov &lt;/a&gt;. Entah siapanya &lt;a href=&quot;https://twitter.com/dan_abramov&quot;&gt; Dan Abramov &lt;/a&gt; si Aaron ini.&lt;/p&gt;
&lt;h2&gt;Keynote By Mark Zukerberg&lt;/h2&gt;
&lt;p&gt;Setelah mengantri cukup panjang untuk masuk ke auditorium, akhirnya bisa dapat tempat duduk yang cukup strategis.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_AMQhtCJzEAb2-OskvuQIUw-300w.webp 300w, https://rizafahmi.com/img/1_AMQhtCJzEAb2-OskvuQIUw-600w.webp 600w, https://rizafahmi.com/img/1_AMQhtCJzEAb2-OskvuQIUw-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_AMQhtCJzEAb2-OskvuQIUw-300w.png&quot; alt=&quot;Ngantri with om Bambang dan Firdaus&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_AMQhtCJzEAb2-OskvuQIUw-300w.png 300w, https://rizafahmi.com/img/1_AMQhtCJzEAb2-OskvuQIUw-600w.png 600w, https://rizafahmi.com/img/1_AMQhtCJzEAb2-OskvuQIUw-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Ngantri with om Bambang dan Firdaus&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;DAN bisa foto dan naik panggung sebelum Mark muncul! Walaupun setelah itu dikejar-kejar satpam :)&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_-cAGTJ0EGesmbWtTWXjCBg-300w.webp 300w, https://rizafahmi.com/img/1_-cAGTJ0EGesmbWtTWXjCBg-600w.webp 600w, https://rizafahmi.com/img/1_-cAGTJ0EGesmbWtTWXjCBg-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_-cAGTJ0EGesmbWtTWXjCBg-300w.png&quot; alt=&quot;DevC Asia Pacific foto-foto di depan stage sebelum Mark tampil.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_-cAGTJ0EGesmbWtTWXjCBg-300w.png 300w, https://rizafahmi.com/img/1_-cAGTJ0EGesmbWtTWXjCBg-600w.png 600w, https://rizafahmi.com/img/1_-cAGTJ0EGesmbWtTWXjCBg-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;DevC Asia Pacific foto-foto di depan stage sebelum Mark tampil.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_1ZP18jOOg8GKH7EQCFXg3g-300w.webp 300w, https://rizafahmi.com/img/1_1ZP18jOOg8GKH7EQCFXg3g-600w.webp 600w, https://rizafahmi.com/img/1_1ZP18jOOg8GKH7EQCFXg3g-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_1ZP18jOOg8GKH7EQCFXg3g-300w.png&quot; alt=&quot;With DevC Jakarta: Om Luri (paling kiri) dan Anne.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_1ZP18jOOg8GKH7EQCFXg3g-300w.png 300w, https://rizafahmi.com/img/1_1ZP18jOOg8GKH7EQCFXg3g-600w.png 600w, https://rizafahmi.com/img/1_1ZP18jOOg8GKH7EQCFXg3g-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;With DevC Jakarta: Om Luri (paling kiri) dan Anne.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ok, masuk ke catatan &lt;em&gt;keynote&lt;/em&gt;. Saya ngga akan me-&lt;em&gt;review&lt;/em&gt; secara detil ya disini. Silakan baca atau nonton videonya kalo mau lebih detil. Saya hanya akan me-&lt;em&gt;review&lt;/em&gt; dari sudut pandang saya dan ada beberapa momen yang mungkin terlewat karena saya tertidur karena jet lag :)&lt;/p&gt;
&lt;p&gt;Terlepas dari masalah yang dihadapi akhir-akhir ini, Mark terlihat segar dan cukup ceria. Mengusung tagline “&lt;strong&gt;We will keep building&lt;/strong&gt;”, Mark membawakannya dengan semangat yang tinggi sehingga saya yang mendengarkan juga bisa ikut merasakan semangatnya. Sangking semangatnya hingga tertidur di tengah-tengah &lt;em&gt;talk&lt;/em&gt; 😉.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_sm9hNEsX8IV3hKEmvFYx8A-300w.webp 300w, https://rizafahmi.com/img/1_sm9hNEsX8IV3hKEmvFYx8A-600w.webp 600w, https://rizafahmi.com/img/1_sm9hNEsX8IV3hKEmvFYx8A-960w.webp 960w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_sm9hNEsX8IV3hKEmvFYx8A-300w.png&quot; alt=&quot;Mark on the stage.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;960&quot; height=&quot;720&quot; srcset=&quot;https://rizafahmi.com/img/1_sm9hNEsX8IV3hKEmvFYx8A-300w.png 300w, https://rizafahmi.com/img/1_sm9hNEsX8IV3hKEmvFYx8A-600w.png 600w, https://rizafahmi.com/img/1_sm9hNEsX8IV3hKEmvFYx8A-960w.png 960w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Berikut beberapa catatan dari keynote Mark Zuckerberg terkati Facebook:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;App review kembali dibuka.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sempat mengangkat isu privasi dan privasi data meski porsinya tidak terlalu banyak.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Facebook akan fokus memberantas berita &lt;em&gt;hoax&lt;/em&gt;, &lt;em&gt;spam&lt;/em&gt;, dan akun palsu. Mungkin untuk konten berbahasa Indonesia bisa pakai &lt;a href=&quot;https://www.youtube.com/watch?v=3qAdcwIyGKM&quot;&gt;engine yang dibuat alumni HACKTIV8&lt;/a&gt; 😉.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Beberapa tambahan fitur untuk grup dan komunitas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Facebook akan mengeluarkan fitur kencan ala tinder.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Akan ada &lt;em&gt;marketplace&lt;/em&gt;, jadi bisa jualan di Facebook. Mark bilang hal ini terinspirasi dari Indonesia yang sudah menggunakan Facebook sebagai tempat jualan.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Akan ada up vote dan down vote.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Untuk instagram sendiri ada beberapa fitur yang akan ditambahkan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Instagram akan memperbarui halaman &lt;em&gt;explore.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Akan ada juga fitur video chat.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tambahan &lt;em&gt;Augmented Reality Camera Effect&lt;/em&gt;. Jadi bisa nambahin efek AR di foto.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sementara untuk WhatsApp, ada beberapa update juga:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Shout out&lt;/em&gt; dan tepuk tangan dari Mark untuk co-founder WhatsApp yang memutuskan keluar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Akan hadir fitur &lt;em&gt;group video calling&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;WhatsApp for Business&lt;/em&gt; akan segera &lt;em&gt;open to public.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dan sebagai catatan penutup, Oculus meluncurkan produk barunya yaitu &lt;a href=&quot;https://www.oculus.com/go/&quot;&gt;Oculus Go&lt;/a&gt; dan harganya $199 dan semua yang ikutan F8 mendapatkannya secara gratis!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_OAh9_OHfUlkZQCyYmIzxMQ-300w.webp 300w, https://rizafahmi.com/img/1_OAh9_OHfUlkZQCyYmIzxMQ-600w.webp 600w, https://rizafahmi.com/img/1_OAh9_OHfUlkZQCyYmIzxMQ-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_OAh9_OHfUlkZQCyYmIzxMQ-300w.png&quot; alt=&quot;Oculus Go sudah ditangan&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_OAh9_OHfUlkZQCyYmIzxMQ-300w.png 300w, https://rizafahmi.com/img/1_OAh9_OHfUlkZQCyYmIzxMQ-600w.png 600w, https://rizafahmi.com/img/1_OAh9_OHfUlkZQCyYmIzxMQ-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Oculus Go sudah ditangan&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Hunting Swag&lt;/h2&gt;
&lt;p&gt;Kegiatan berikutnya adalah hunting swag! 😈 Dapat cukup banyak sampai-sampai koper nyaris tidak muat. Hampir semua booth memanjakan pengunjung dengan berbagai swag keren. &lt;em&gt;Booth-booth&lt;/em&gt; yang ada semuanya adalah produk Facebook. Mulai dari Oculus, Messenger, Analytics, Video, PyTorch, Ads, Instagram, dan banyak yang lainnya. Hasilnya… Cukup menggembirakan!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_JzPUcm47l0jj06QEC_G4OA-300w.webp 300w, https://rizafahmi.com/img/1_JzPUcm47l0jj06QEC_G4OA-600w.webp 600w, https://rizafahmi.com/img/1_JzPUcm47l0jj06QEC_G4OA-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_JzPUcm47l0jj06QEC_G4OA-300w.png&quot; alt=&quot;Hunted!&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_JzPUcm47l0jj06QEC_G4OA-300w.png 300w, https://rizafahmi.com/img/1_JzPUcm47l0jj06QEC_G4OA-600w.png 600w, https://rizafahmi.com/img/1_JzPUcm47l0jj06QEC_G4OA-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Hunted!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dan yang menjadi favorit &lt;em&gt;booth&lt;/em&gt; buat saya adalah &lt;em&gt;booth&lt;/em&gt; Open Source! Sangking kerennya, &lt;em&gt;booth&lt;/em&gt; ini layak mendapat porsi pembahasan tersendiri.&lt;/p&gt;
&lt;h2&gt;Open Source Booth&lt;/h2&gt;
&lt;p&gt;Kenapa &lt;em&gt;booth&lt;/em&gt; ini menjadi favorit? Karena dikasih segepok stiker buat dibagi-bagi ke komunitas di Jakarta. Alasan kedua karena bisa bertemu dengan &lt;em&gt;influencer&lt;/em&gt; di dunia open source dan &lt;em&gt;tech scene&lt;/em&gt; secara umum. Booth ini dijaga oleh &lt;a href=&quot;https://github.com/JoelMarcey&quot;&gt;Joel Marcey&lt;/a&gt;, Developer Advocate Facebook. Saya sempat berinteraksi dengan Joel ketika mencoba kontribusi ke salah satu project open source &lt;a href=&quot;https://github.com/facebook/Docusaurus/issues/467&quot;&gt;Docusaurus&lt;/a&gt;. Dan bisa bertemu dan diskusi langsung adalah hal yang sangat menyenangkan.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_dck_uuDn4CHM-N8HDCijOQ-300w.webp 300w, https://rizafahmi.com/img/1_dck_uuDn4CHM-N8HDCijOQ-600w.webp 600w, https://rizafahmi.com/img/1_dck_uuDn4CHM-N8HDCijOQ-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_dck_uuDn4CHM-N8HDCijOQ-300w.png&quot; alt=&quot;With Joel&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_dck_uuDn4CHM-N8HDCijOQ-300w.png 300w, https://rizafahmi.com/img/1_dck_uuDn4CHM-N8HDCijOQ-600w.png 600w, https://rizafahmi.com/img/1_dck_uuDn4CHM-N8HDCijOQ-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;With Joel&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dan ada satu orang lagi yang menjaga &lt;em&gt;booth&lt;/em&gt; open source adalah &lt;a href=&quot;https://twitter.com/ericnakagawa&quot;&gt;Eric Nakagawa&lt;/a&gt;! Dia adalah orang yang bertanggung jawab terhadap semua project open source yang ada di Facebook! Sebenarnya ada kesempatan bertemu kemaren pas acara DevC Leadership tapi saya &lt;em&gt;missed&lt;/em&gt; karena sedang ngobrol dengan &lt;a href=&quot;https://www.facebook.com/chukwuemeka.afigbo&quot;&gt;Emeka Afigbo&lt;/a&gt;. &lt;a href=&quot;https://rizafahmi.com/2018/05/08/f8-san-jose-trip-day-0/&quot;&gt;Silakan baca artikel sebelumnya&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_m_Hrdb-uR2CO5yCvGih_iw-300w.webp 300w, https://rizafahmi.com/img/1_m_Hrdb-uR2CO5yCvGih_iw-600w.webp 600w, https://rizafahmi.com/img/1_m_Hrdb-uR2CO5yCvGih_iw-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_m_Hrdb-uR2CO5yCvGih_iw-300w.png&quot; alt=&quot;With Eric Nakagawa&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_m_Hrdb-uR2CO5yCvGih_iw-300w.png 300w, https://rizafahmi.com/img/1_m_Hrdb-uR2CO5yCvGih_iw-600w.png 600w, https://rizafahmi.com/img/1_m_Hrdb-uR2CO5yCvGih_iw-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;With Eric Nakagawa&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dengan Eric diskusi cukup banyak. Yang saya baru tahu adalah Eric sempat mencoba menjadi podcaster. Dia sempat menjalankan podcast dengan format yang, well, mirip dengan &lt;a href=&quot;https://ceritanyadeveloper.com/&quot;&gt;Ceritanya Developer&lt;/a&gt;, podcast yang sedang jalankan. Dia melakukan interview dengan teman-temannya yang adalah developer juga. Namanya &lt;a href=&quot;https://itunes.apple.com/pl/podcast/potluck-podcast/id1196828738&quot;&gt;Potluck Podcast &lt;/a&gt;dan sudah berhenti di episode 6. Sudah tidak bisa di &lt;em&gt;download&lt;/em&gt; dan didengarkan, sayangnya.&lt;/p&gt;
&lt;p&gt;Kemudian giliran saya yang bercerita. Saya sampaikan bahwa saya juga baru saja me-&lt;em&gt;launch&lt;/em&gt; sebuah &lt;a href=&quot;https://ceritanyadeveloper.com/&quot;&gt;podcast&lt;/a&gt; setelah &lt;a href=&quot;https://soundcloud.com/appscoast&quot;&gt;podcast lama saya berhenti&lt;/a&gt;. Saya juga sempat memperlihatkan statistik dua episode awal: &lt;a href=&quot;https://anchor.fm/ceritanya-developer/episodes/Coming-Soon-e1aaad&quot;&gt;episode teaser/coming soon&lt;/a&gt; dan &lt;a href=&quot;https://anchor.fm/ceritanya-developer/episodes/devs0--Dicky-Arinal-e186lm&quot;&gt;episode pertama&lt;/a&gt;. Dia cukup kaget dan bilang “Impressive! You’re doing much better than me!!”. Terimakasih banyak pendengar &lt;a href=&quot;https://ceritanyadeveloper.com/&quot;&gt;Ceritanya Developer Podcast&lt;/a&gt;. Karena kalian, saya jadi bisa sedikit pamer didepan sosok &lt;em&gt;prolific&lt;/em&gt; seperti Eric 😈.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_IIbxY1Z4mHvCg1Cpsqs1wQ-300w.webp 300w, https://rizafahmi.com/img/1_IIbxY1Z4mHvCg1Cpsqs1wQ-600w.webp 600w, https://rizafahmi.com/img/1_IIbxY1Z4mHvCg1Cpsqs1wQ-1080w.webp 1080w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_IIbxY1Z4mHvCg1Cpsqs1wQ-300w.png&quot; alt=&quot;Statistik Ceritanya Developer Podcast&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1080&quot; height=&quot;1920&quot; srcset=&quot;https://rizafahmi.com/img/1_IIbxY1Z4mHvCg1Cpsqs1wQ-300w.png 300w, https://rizafahmi.com/img/1_IIbxY1Z4mHvCg1Cpsqs1wQ-600w.png 600w, https://rizafahmi.com/img/1_IIbxY1Z4mHvCg1Cpsqs1wQ-1080w.png 1080w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Kemudian Eric juga memperingatkan saya supaya menjaga momentum dan jangan sampai &lt;em&gt;burnout&lt;/em&gt;. Dia menyebutkan bahwa dia melakukan podcast &lt;strong&gt;sambil&lt;/strong&gt; membuat &lt;em&gt;tools&lt;/em&gt; untuk podcast. Agak kepo dan ingin melakukan analisa terhadap pendengarnya, Eric memutuskan membuat sendiri &lt;em&gt;analytic tools&lt;/em&gt; yang bisa melihat &lt;em&gt;behavior&lt;/em&gt; pendengar secara &lt;em&gt;realtime&lt;/em&gt;. Hal itulah yang akhirnya membuat dia &lt;em&gt;burnout&lt;/em&gt; dan memutuskan berhenti nge-&lt;em&gt;podcast&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Eric juga sempat &lt;em&gt;share best practice&lt;/em&gt; untuk podcast. Katanya yang paling optimal adalah &lt;em&gt;publish&lt;/em&gt; seminggu sekali. Atau paling tidak dua minggu sekali. Karena kalau lebih lama, misalnya sebulan sekali maka pendengar akan bertanya-tanya dan sudah &lt;em&gt;nagih&lt;/em&gt; episode baru di dua minggu pertama. Tapi &lt;em&gt;challenge&lt;/em&gt;-nya melakukan podcast seminggu sekali adalah &lt;em&gt;burnout&lt;/em&gt; dan kehabisan narasumber kalau formatnya interview. Format seminggu sekali mungkin cocok untuk podcast dengan format &lt;em&gt;self talk&lt;/em&gt; kali ya.&lt;/p&gt;
&lt;p&gt;Saya kemudian juga share ke Eric bahwa saya menggunakan format yang sedikit berbeda. Saya menggunakan format &lt;em&gt;season&lt;/em&gt; seperti TV Series untuk podcast &lt;a href=&quot;https://ceritanyadeveloper.com/&quot;&gt;Ceritanya Developer&lt;/a&gt;. Jadi dalam setahun saya &lt;em&gt;nyetok&lt;/em&gt; delapan interview dan akan saya publish setiap bulan. Dan kalo responnya ok baru saya lanjut ke &lt;em&gt;season&lt;/em&gt; berikutnya. Dan menurut dia format seperti ini cukup menarik dan cukup bagus. &lt;em&gt;Let see&lt;/em&gt;…&lt;/p&gt;
&lt;p&gt;Setelah selesai curhat seputar podcast, saya mulai bertanya &lt;em&gt;insight&lt;/em&gt; tentang &lt;em&gt;development&lt;/em&gt; dan teknologi kepada Eric. Dia menyebutkan artificial intelligence atau AI adalah masa depan. Dan menyarankan kita, developer, untuk segera belajar AI. Untuk memulai belajar AI, Eric menyarankan belajar dari &lt;a href=&quot;http://fast.ai/&quot;&gt;fast.ai&lt;/a&gt; karya Jeremy Howard. Saya sempat tanya, gimana dengan &lt;em&gt;course&lt;/em&gt; &lt;a href=&quot;https://www.coursera.org/learn/machine-learning/&quot;&gt;Andrew NG&lt;/a&gt; yang ada di &lt;a href=&quot;https://www.coursera.org/learn/machine-learning/&quot;&gt;Coursera&lt;/a&gt;? Menurut Eric, punya Andrew NG bagus untuk mempelajari teori yang lebih mendalam sementara course Jeremy Howard lebih &lt;em&gt;practical&lt;/em&gt;. Di lesson pertama saja kita sudah bisa membuat &lt;em&gt;image classification&lt;/em&gt; yang membedakan gambar kucing dengan gambar anjing.&lt;/p&gt;
&lt;p&gt;Jadi mari segera belajar AI.&lt;/p&gt;
&lt;h2&gt;Anne On The Stage&lt;/h2&gt;
&lt;p&gt;Setelah bertemu Eric dan Joel dan mendapatkan &lt;em&gt;insight&lt;/em&gt; yang &lt;em&gt;super useful&lt;/em&gt; saya dan teman-teman sangat merasa puas. Saya bisa tidur nyenyak nih nanti malam 😃. Tapi ada satu lagi momen dimana saya merinding. Bukan (hanya) karena kedinginan, tapi karena menjadi saksi dan menyaksikan teman seperjuangan, &lt;a href=&quot;https://www.facebook.com/annereginancy&quot;&gt;Anne&lt;/a&gt; berdiri dan &lt;em&gt;talk&lt;/em&gt; didepan audience F8! Bangga lah pasti sebagai teman dan co-lead. Meski bukan panggung utama, tapi tetap aja!!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_oSCToY-XQoW2OAa98bVsGg-300w.webp 300w, https://rizafahmi.com/img/1_oSCToY-XQoW2OAa98bVsGg-600w.webp 600w, https://rizafahmi.com/img/1_oSCToY-XQoW2OAa98bVsGg-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_oSCToY-XQoW2OAa98bVsGg-300w.png&quot; alt=&quot;Anne on the stage&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_oSCToY-XQoW2OAa98bVsGg-300w.png 300w, https://rizafahmi.com/img/1_oSCToY-XQoW2OAa98bVsGg-600w.png 600w, https://rizafahmi.com/img/1_oSCToY-XQoW2OAa98bVsGg-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Anne on the stage&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Topik yang diangkat adalah tentang komunitas dan &lt;em&gt;female developer&lt;/em&gt;. Sampai saat ini belum ada videonya, semoga ada rekamannya jadi teman-teman bisa nonton juga.&lt;/p&gt;
&lt;p&gt;Itu dia keseruan di hari pertama. Secara umum saya banyak melakukan &lt;em&gt;networking&lt;/em&gt; dan ngobrol di hari pertaman ini. Bayangkan orang-orang hebat sekelas Eric Nakagawa jaga stand dan bisa diajak diskusi, kapan lagi coba kesempatan itu muncul?! Gara-gara kebanyakan diskusi jadi porsi nonton &lt;em&gt;talk&lt;/em&gt; jadi minimun.&lt;/p&gt;
&lt;p&gt;Nantikan keseruan di hari kedua. Untuk hari kedua saya fokus melihat beberapa &lt;em&gt;talk-talk&lt;/em&gt; keren. Kalau mau dengar penuturan langsung dari kami yang berangkat, silakan join &lt;a href=&quot;https://www.facebook.com/groups/DevCJakarta/&quot;&gt;grup facebook DevC Jakarta&lt;/a&gt;. Kita akan mengadakan meetup khusus membahas tentang pengalaman kita di F8.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>F8 Silicon Valley Trip Day 0</title>
    <link href="https://rizafahmi.com/2018/05/08/f8-san-jose-trip-day-0/"/>
    <updated>2018-05-08T00:00:00Z</updated>
    <pubDate>2018-05-08T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2018/05/08/f8-san-jose-trip-day-0/</id>
    <summary>Berikut adalah rekap perjalanan saya ketika diundang menghadiri F8 Developer Conference sebagai salah satu Facebook Developer Circle yang beruntung. Di H-1 sebagai leads dari berbagai kota di belahan dunia, kita semua…</summary>
    <category term="catatan, komunitas, konferensi, travel"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/1_J7TJO5VQfndtn3cyjF4flg.jpeg"/>
    <content type="html">&lt;p&gt;Berikut adalah rekap perjalanan saya ketika diundang menghadiri F8 Developer Conference sebagai salah satu Facebook Developer Circle yang beruntung.&lt;/p&gt;
&lt;p&gt;Di H-1 sebagai &lt;em&gt;leads&lt;/em&gt; dari berbagai kota di belahan dunia, kita semua diminta untuk &lt;em&gt;gathering&lt;/em&gt; di Facebook HQ untuk mengikuti beberapa acara menarik. Berikut ceritanya.&lt;/p&gt;
&lt;h2&gt;Ketemu Simon CTO Praekelt asal Belanda&lt;/h2&gt;
&lt;p&gt;Duduk sebelahan di bis dari &lt;a href=&quot;https://www.marriott.com/hotels/travel/sjcsj-san-jose-marriott/&quot;&gt; Hotel Marriot San Jose &lt;/a&gt; ke Facebook HQ di Menlo Park. Lokasi cukup jauh, sekitar 1 jam perjalanan jadi bisa diskusi cukup panjang. Bukan diskusi sebenarnya, lebih ke interview karena &lt;em&gt;mostly&lt;/em&gt; saya yang banyak nanya :)&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_Mcr11waT9z8dM8rs--G92A-300w.webp 300w, https://rizafahmi.com/img/1_Mcr11waT9z8dM8rs--G92A-600w.webp 600w, https://rizafahmi.com/img/1_Mcr11waT9z8dM8rs--G92A-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_Mcr11waT9z8dM8rs--G92A-300w.png&quot; alt=&quot;Simon de Haan&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_Mcr11waT9z8dM8rs--G92A-300w.png 300w, https://rizafahmi.com/img/1_Mcr11waT9z8dM8rs--G92A-600w.png 600w, https://rizafahmi.com/img/1_Mcr11waT9z8dM8rs--G92A-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Simon de Haan&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Percakapan dimulai dari pekerjaan kemudian diskusi kita lanjutkan ke bahasa pemrograman &lt;a href=&quot;https://www.python.org/&quot;&gt; Python &lt;/a&gt; yang menjadi favoritnya, bahasa yang sehari-hari ia dan timnya gunakan. Simon menggunakan Python karena elegansi dari syntaks-nya, bahasa yang sudah &lt;em&gt;mature&lt;/em&gt; dan &lt;em&gt;well crafted&lt;/em&gt;, menurutnya. Saya baru sadar, mungkin ada unsur nasionalisme juga karena &lt;a href=&quot;https://en.wikipedia.org/wiki/Guido_van_Rossum&quot;&gt;Guido&lt;/a&gt; sang pembuat Python juga berasal dari negara yang sama, Belanda.&lt;/p&gt;
&lt;p&gt;Kemudian pertanyaan saya lanjutkan ke pemilihan &lt;em&gt;web framework&lt;/em&gt; dan Simon menuturkan bahwa mereka menggunakan &lt;a href=&quot;https://github.com/twisted/twisted&quot;&gt;Twisted&lt;/a&gt; sebuah &lt;em&gt;web framework&lt;/em&gt; yang sifatnya &lt;em&gt;event-driven&lt;/em&gt;. Untungnya saya pernah riset tentang Twisted sebelumnya, jadi lumayan mengerti :) Pertanyaan saya lanjutkan kenapa Twisted kok kurang populer. Menurut Simon karena memang susah, dan tidak &lt;em&gt;straightforward&lt;/em&gt; penggunaannya. Dokumentasinya pun kurang mendukung. Untuk &lt;em&gt;event-driven&lt;/em&gt; dan &lt;em&gt;callback&lt;/em&gt;, NodeJS &lt;em&gt;did it better&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Kemudian bahasan kita lanjutkan ke bahasa pemrograman lain. Tidak disangka ternyata dia juga menggunakan &lt;a href=&quot;https://elixir-lang.org/&quot;&gt;Elixir&lt;/a&gt; khusus untuk beberapa project yang butuh &lt;em&gt;concurrency&lt;/em&gt;. Alasan dipilihnya Elixir karena WhatsApp menggunakan Erlang dan Erlang VM memungkinkan WhatsApp &lt;em&gt;scale&lt;/em&gt; hingga mampu menangani 2 juta koneksi secara berbarengan. Awalnya Simon mencoba &lt;a href=&quot;http://www.erlang.org/&quot;&gt;Erlang&lt;/a&gt;, tapi ternyata dia ngga begitu suka sintaks-nya dan ketika Elixir muncul, tanpa pikir panjang Simon langsung mengadaptasinya kedalam project yang sedang ia tangani.&lt;/p&gt;
&lt;p&gt;Obrolan kita berlanjut, saya kembali bertanya kok sekarang &lt;em&gt;functional programming&lt;/em&gt; kembali &lt;em&gt;hyped&lt;/em&gt;. Padahal paradigma ini kan cukup jadul dan sudah lama ada. Bahkan sudah ada sebelum paradigma OOP muncul. Menurutnya, &lt;em&gt;tools&lt;/em&gt;, &lt;em&gt;requirement&lt;/em&gt; dan aplikasi semakin berkembang dan developer terus mencari solusi yang lebih sederhana untuk mengembangkan aplikasi, terutama proses development yang lebih terprediksi dan saat ini tren sedang menuju kepada tools yang memberikan developer rasa aman. Misalnya saja paradigma &lt;em&gt;functional programming, static typed&lt;/em&gt; sekarang sedang digemari seperti Haskell, TypeScript, Elm dan lain sebagainya. Oh iya, dia juga menggunakan Elm, React dan Redux. Dia juga tertarik ke &lt;a href=&quot;https://reasonml.github.io/&quot;&gt;ReasonML&lt;/a&gt;, meski belum pernah menggunakan.&lt;/p&gt;
&lt;p&gt;Percakapan ditutup ketika Simon bercerita bahwa selain menjadi CTO, saat ini dia juga sedang menggagas sebuah startup bersama seorang temannya. Masih di area &lt;em&gt;healthcare&lt;/em&gt;. Luar biasa ya, pagi jadi CTO malam jadi co-founder.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/sdehaan/&quot;&gt;Linkedin-nya Simon&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Meet and Greet Developer Circle Around The World&lt;/h2&gt;
&lt;p&gt;Tidak bisa saya jabarkan satu-per-satu sih. Di sebuah ruangan seluruh &lt;em&gt;leads&lt;/em&gt; dari Developer Circle seluruh dunia berkumpul. Dan itu saja sudah membuat saya merinding.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_O2ZOfTZxuRTi-XellkcNdA-300w.webp 300w, https://rizafahmi.com/img/1_O2ZOfTZxuRTi-XellkcNdA-600w.webp 600w, https://rizafahmi.com/img/1_O2ZOfTZxuRTi-XellkcNdA-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_O2ZOfTZxuRTi-XellkcNdA-300w.png&quot; alt=&quot;Sean Liu&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_O2ZOfTZxuRTi-XellkcNdA-300w.png 300w, https://rizafahmi.com/img/1_O2ZOfTZxuRTi-XellkcNdA-600w.png 600w, https://rizafahmi.com/img/1_O2ZOfTZxuRTi-XellkcNdA-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Sean Liu&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sempat ngobrol dengan sebagian kecil dari mereka, ada &lt;a href=&quot;https://www.facebook.com/profile.php?id=638368594&amp;amp;ref=br_rs&quot;&gt;Sean Liu&lt;/a&gt; lead DevC Taiwan yang sangat ingin sekali mengenalkan &lt;em&gt;co-lead&lt;/em&gt;-nya ke saya, entah kenapa :) Sean adalah developer yang fokus kepada teknologi chatbot.&lt;/p&gt;
&lt;p&gt;Ada juga &lt;a href=&quot;https://www.facebook.com/edwinallenz&quot;&gt;Edwin&lt;/a&gt; yang sangat membenci kalau ada orang yang mojok sendirian, pasti dia samperin dan diajak ngumpul ke grup.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_CNQX-krD7H05uxBOqKsIVg-300w.webp 300w, https://rizafahmi.com/img/1_CNQX-krD7H05uxBOqKsIVg-600w.webp 600w, https://rizafahmi.com/img/1_CNQX-krD7H05uxBOqKsIVg-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_CNQX-krD7H05uxBOqKsIVg-300w.png&quot; alt=&quot;Edwin (paling kiri)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_CNQX-krD7H05uxBOqKsIVg-300w.png 300w, https://rizafahmi.com/img/1_CNQX-krD7H05uxBOqKsIVg-600w.png 600w, https://rizafahmi.com/img/1_CNQX-krD7H05uxBOqKsIVg-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Edwin (paling kiri)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.facebook.com/bonnie.milian.5&quot;&gt;Bonnie&lt;/a&gt; juga salah satu dari 3 co-lead DevC Gutemala. Menariknya Bonnie punya passion yang cukup besar di akademika dan &lt;em&gt;lecturing&lt;/em&gt;. Coba dia mau ke Indonesia, pasti akan saya &lt;em&gt;hire&lt;/em&gt; untuk jadi instruktur ;)&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_fNAU2BbDQAgiaRJuTiaMQw-300w.webp 300w, https://rizafahmi.com/img/1_fNAU2BbDQAgiaRJuTiaMQw-600w.webp 600w, https://rizafahmi.com/img/1_fNAU2BbDQAgiaRJuTiaMQw-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_fNAU2BbDQAgiaRJuTiaMQw-300w.png&quot; alt=&quot;With Bonnie (paling kanan)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_fNAU2BbDQAgiaRJuTiaMQw-300w.png 300w, https://rizafahmi.com/img/1_fNAU2BbDQAgiaRJuTiaMQw-600w.png 600w, https://rizafahmi.com/img/1_fNAU2BbDQAgiaRJuTiaMQw-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;With Bonnie (paling kanan)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sempat ngobrol juga dengan DevC lead Bangkok &lt;a href=&quot;https://www.facebook.com/suwitcha.sugthana&quot;&gt;Pondd&lt;/a&gt; dan share tentang &lt;em&gt;insight tech scene&lt;/em&gt; di Bangkok seperti apa. Katanya, di Bangkok lagi demam blockchain. Semua teknologi maunya di blockchain-kan :) Dan ternyata dia juga temannya om &lt;a href=&quot;https://www.facebook.com/rendra.toro&quot;&gt; Rendra Toro &lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Oh iya, ada satu percakapan menarik lagi yang harus di-&lt;em&gt;mention&lt;/em&gt;. Saya sempat berbincang sebentar dengan &lt;a href=&quot;https://www.facebook.com/chukwuemeka.afigbo&quot;&gt;Emeka Afigbo&lt;/a&gt; Manager Developer Programs di Facebook. Waktu kenalan dan begitu tahu saya Riza dari Jakarta dia bilang gini: “I’ve heard a lot of good things about you!”. Terus saya kaget, dan saya tanya balik: “About me or about DevC Jakarta?”. Kalo tentang DevC Jakarta saya ngga kaget, karena co-lead saya keren-keren. Dan dengan yakin dia menjawab: “No, You!”. Saya langsung terharu dan tidak bisa berkata-kata. Entah apa maksudnya &lt;em&gt;good things about me&lt;/em&gt; itu. Dan saya tidak punya keberanian untuk bertanya lebih lanjut. Dan saya juga tidak berani ngajak foto bareng :)&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1*-g8BP2EG8NCTLWkTM1wNqA-300w.webp 300w, https://rizafahmi.com/img/1*-g8BP2EG8NCTLWkTM1wNqA-600w.webp 600w, https://rizafahmi.com/img/1*-g8BP2EG8NCTLWkTM1wNqA-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1*-g8BP2EG8NCTLWkTM1wNqA-300w.png&quot; alt=&quot;Video Emeka (paling kanan) di stage F8 2018&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;720&quot; srcset=&quot;https://rizafahmi.com/img/1*-g8BP2EG8NCTLWkTM1wNqA-300w.png 300w, https://rizafahmi.com/img/1*-g8BP2EG8NCTLWkTM1wNqA-600w.png 600w, https://rizafahmi.com/img/1*-g8BP2EG8NCTLWkTM1wNqA-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;
&lt;em&gt;Video Emeka (paling kanan) di stage F8 2018. Link: &lt;a href=&quot;https://developers.facebook.com/videos/f8-2018/partner-panel-how-to-grow-your-business-with-facebook/&quot;&gt;https://developers.facebook.com/videos/f8-2018/partner-panel-how-to-grow-your-business-with-facebook/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Banyak lagi obrolan singkat nan menarik dengan leads di berbagai kota. Tidak bisa saya jabarkan disini satu-per-satu.&lt;/p&gt;
&lt;h2&gt;Bertemu Developer Asal Indonesia Yang Bekerja Di Facebook&lt;/h2&gt;
&lt;p&gt;Jauh sebelum hari H, kita sudah diinformasikan apabila ingin bertemu dengan &lt;em&gt;engineer&lt;/em&gt; Facebook, yang dikenal tentunya, silakan &lt;em&gt;request&lt;/em&gt; biar bisa ketemu.&lt;/p&gt;
&lt;p&gt;Saya kenal seorang &lt;em&gt;engineer&lt;/em&gt; asal Indonesia yang bekerja di Facebook. Namanya &lt;a href=&quot;https://www.facebook.com/fkgozali&quot;&gt;Kevin Gozali&lt;/a&gt;. Orang inilah yang bertanggung jawab memperkenalkan saya dengan React :) Kita pernah ketemu di akhir tahun 2015 dan saya minta diajari React pada saat itu.&lt;/p&gt;
&lt;p&gt;Dan ternyata kebetulan pada hari itu dia sedang cuti 😢. Tapi karena tahu ada kontingen Indonesia yang sedang berada di Facebook HQ, dia sempatkan untuk datang dari rumahnya, yang katanya ngga terlalu jauh dari kantor Facebook. Thanks Kevin!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_KXoZw7rt24DDmxbH31nZMw-300w.webp 300w, https://rizafahmi.com/img/1_KXoZw7rt24DDmxbH31nZMw-600w.webp 600w, https://rizafahmi.com/img/1_KXoZw7rt24DDmxbH31nZMw-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_KXoZw7rt24DDmxbH31nZMw-300w.png&quot; alt=&quot;With Kevin&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_KXoZw7rt24DDmxbH31nZMw-300w.png 300w, https://rizafahmi.com/img/1_KXoZw7rt24DDmxbH31nZMw-600w.png 600w, https://rizafahmi.com/img/1_KXoZw7rt24DDmxbH31nZMw-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;With Kevin&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Pada waktu pertama ketemu, Kevin masuk dalam tim Ads-nya Facebook dan karena kontribusinya ke React dan React Native sekarang ia 8fulltime8 ngurusin React Native bersama 10 orang yang ada di Facebook. Lebih lanjut diskusi teknis tentang React dan React Native nanti dibagian Happy Hour.&lt;/p&gt;
&lt;h2&gt;Facebook HQ Tour&lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/0_YCHe0_71PsFIPuMn-300w.webp 300w, https://rizafahmi.com/img/0_YCHe0_71PsFIPuMn-600w.webp 600w, https://rizafahmi.com/img/0_YCHe0_71PsFIPuMn-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/0_YCHe0_71PsFIPuMn-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;420&quot; srcset=&quot;https://rizafahmi.com/img/0_YCHe0_71PsFIPuMn-300w.png 300w, https://rizafahmi.com/img/0_YCHe0_71PsFIPuMn-600w.png 600w, https://rizafahmi.com/img/0_YCHe0_71PsFIPuMn-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Setelah acara Leadership Sessions DevC selesai, kita pun diajak tour keliling kantor Facebook. Kantornya keren banget pastinya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_YBFIr87UYOC-JLDqi6hjoA-300w.webp 300w, https://rizafahmi.com/img/1_YBFIr87UYOC-JLDqi6hjoA-600w.webp 600w, https://rizafahmi.com/img/1_YBFIr87UYOC-JLDqi6hjoA-1056w.webp 1056w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_YBFIr87UYOC-JLDqi6hjoA-300w.png&quot; alt=&quot;Salah satu sisi kantor facebook&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1056&quot; height=&quot;1408&quot; srcset=&quot;https://rizafahmi.com/img/1_YBFIr87UYOC-JLDqi6hjoA-300w.png 300w, https://rizafahmi.com/img/1_YBFIr87UYOC-JLDqi6hjoA-600w.png 600w, https://rizafahmi.com/img/1_YBFIr87UYOC-JLDqi6hjoA-1056w.png 1056w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Salah satu sisi kantor facebook&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Fakta unik dari kantor facebook ini adalah dulunya ini adalah kantor Sun Microsystem. Bahkan plang di depan kantornya pun masih terdapat sisa-sisa kejayaan Sun.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_J7TJO5VQfndtn3cyjF4flg-300w.webp 300w, https://rizafahmi.com/img/1_J7TJO5VQfndtn3cyjF4flg-600w.webp 600w, https://rizafahmi.com/img/1_J7TJO5VQfndtn3cyjF4flg-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_J7TJO5VQfndtn3cyjF4flg-300w.png&quot; alt=&quot;Sisi depan&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_J7TJO5VQfndtn3cyjF4flg-300w.png 300w, https://rizafahmi.com/img/1_J7TJO5VQfndtn3cyjF4flg-600w.png 600w, https://rizafahmi.com/img/1_J7TJO5VQfndtn3cyjF4flg-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Sisi depan&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Foto diatas tampak depan, sementara dibelakangnya seperti ini.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1__-iGjoeKE0qUuOjLh0NQqw-300w.webp 300w, https://rizafahmi.com/img/1__-iGjoeKE0qUuOjLh0NQqw-600w.webp 600w, https://rizafahmi.com/img/1__-iGjoeKE0qUuOjLh0NQqw-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1__-iGjoeKE0qUuOjLh0NQqw-300w.png&quot; alt=&quot;Sisa-sisa kejayaan Sun microsytem&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1__-iGjoeKE0qUuOjLh0NQqw-300w.png 300w, https://rizafahmi.com/img/1__-iGjoeKE0qUuOjLh0NQqw-600w.png 600w, https://rizafahmi.com/img/1__-iGjoeKE0qUuOjLh0NQqw-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Sisa-sisa kejayaan Sun microsytem&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Happy Hour: Ketemu Hack Reactor&lt;/h2&gt;
&lt;p&gt;Setelah acara di kantor Facebook selesai, kita kembali ke Marriot untuk menukar badge buat besok (biar ngga ngantri) dan diundang ke acara Happy Hour.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_KWUEXe6sHoW10TiHhbEnWw-300w.webp 300w, https://rizafahmi.com/img/1_KWUEXe6sHoW10TiHhbEnWw-600w.webp 600w, https://rizafahmi.com/img/1_KWUEXe6sHoW10TiHhbEnWw-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_KWUEXe6sHoW10TiHhbEnWw-300w.png&quot; alt=&quot;Badge F8&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_KWUEXe6sHoW10TiHhbEnWw-300w.png 300w, https://rizafahmi.com/img/1_KWUEXe6sHoW10TiHhbEnWw-600w.png 600w, https://rizafahmi.com/img/1_KWUEXe6sHoW10TiHhbEnWw-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Badge F8&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Saya sempat berencana mau mengunjungi kampus &lt;a href=&quot;https://www.hackreactor.com/&quot;&gt;Hack Reactor&lt;/a&gt; karena dulu saya pengen banget ikutan bootcamp itu. Malah sekarang jadi bikin &lt;a href=&quot;https://hacktiv8.com/&quot;&gt;bootcamp sendiri&lt;/a&gt; :)&lt;/p&gt;
&lt;p&gt;Nah, di even happy hour ini ternyata ada booth &lt;a href=&quot;https://www.hackreactor.com/&quot;&gt;Hack Reactor&lt;/a&gt;! Saya tanya kira-kira saya bisa ikut &lt;em&gt;tour&lt;/em&gt; ke kampusnya apa ngga ya? Dia bilang bisa, justru dia adalah orang yang &lt;em&gt;in charge&lt;/em&gt; di &lt;em&gt;campus tour.&lt;/em&gt; Namanya Andrew, tim Admission and Partnership. Tapi karena dia sibuk ngurusin even F8, &lt;em&gt;tour&lt;/em&gt; ditiadakan seminggu. Tapi ngga masalah bisa bertemu dan ngobrol walau sebentar dengan salah satu tim dari Hack Reactor sudah cukup mengobatinya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_IVtTsYrkvQ4LSoOrVMLL1A-300w.webp 300w, https://rizafahmi.com/img/1_IVtTsYrkvQ4LSoOrVMLL1A-600w.webp 600w, https://rizafahmi.com/img/1_IVtTsYrkvQ4LSoOrVMLL1A-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_IVtTsYrkvQ4LSoOrVMLL1A-300w.png&quot; alt=&quot;With Andrew Hack Reactor&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1600&quot; srcset=&quot;https://rizafahmi.com/img/1_IVtTsYrkvQ4LSoOrVMLL1A-300w.png 300w, https://rizafahmi.com/img/1_IVtTsYrkvQ4LSoOrVMLL1A-600w.png 600w, https://rizafahmi.com/img/1_IVtTsYrkvQ4LSoOrVMLL1A-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;With Andrew Hack Reactor&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Tak lama kemudian, Kevin datang lagi. Memang sudah janjian sih, karena kita mau nanya banyak hal.&lt;/p&gt;
&lt;p&gt;Kontingen Indonesia berebutan mau nanya ke Kevin tentang Facebook, React dan React Native! Diskusi berlanjut hingga larut malam.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_8JMsGy6Vn_pi2xCUFiBYtQ-300w.webp 300w, https://rizafahmi.com/img/1_8JMsGy6Vn_pi2xCUFiBYtQ-600w.webp 600w, https://rizafahmi.com/img/1_8JMsGy6Vn_pi2xCUFiBYtQ-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_8JMsGy6Vn_pi2xCUFiBYtQ-300w.png&quot; alt=&quot;Kevin dibanjiri pertanyaan&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_8JMsGy6Vn_pi2xCUFiBYtQ-300w.png 300w, https://rizafahmi.com/img/1_8JMsGy6Vn_pi2xCUFiBYtQ-600w.png 600w, https://rizafahmi.com/img/1_8JMsGy6Vn_pi2xCUFiBYtQ-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Kevin dibanjiri pertanyaan&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Diskusi Mendalam Tentang React dan React Native&lt;/h2&gt;
&lt;p&gt;Diskusi kita dengan Kevin terus berlanjut. Saya telat join diskusinya karena satu dan lain hal. Saya sempat bertanya pendapatnya tentang &lt;a href=&quot;https://flutter.io/&quot;&gt;Flutter&lt;/a&gt;, haha. Dan saya tidak menemukan jawaban yang menarik dari dia :)&lt;/p&gt;
&lt;p&gt;Yang menarik dari pembicaraan ini adalah fakta bahwa yang menangani library React Native di Facebook ada 10 orang dan butuh kontribusi banyak dari teman-teman. React Native adalah sebuah library besar dan kedepannya React Native akan dipecah kedalam library-library yang lebih kecil agar lebih mudah di-&lt;em&gt;maintain&lt;/em&gt; dan lebih kecil kemungkinan untuk &lt;em&gt;breaking changes&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Diskusi ditutup tentan React Native Navigation dan sedikit insight tentang masa depan library-library navigation untuk React Native.&lt;/p&gt;
&lt;p&gt;Ini &lt;a href=&quot;https://www.facebook.com/fkgozali&quot;&gt;facebook-nya Kevin&lt;/a&gt;. &lt;em&gt;Go add him and say thank you for his contributions and inspiration&lt;/em&gt;!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/0_KkYTQwXh8MSSZnmC-300w.webp 300w, https://rizafahmi.com/img/0_KkYTQwXh8MSSZnmC-600w.webp 600w, https://rizafahmi.com/img/0_KkYTQwXh8MSSZnmC-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/0_KkYTQwXh8MSSZnmC-300w.png&quot; alt=&quot;Indonesia DevC Leads with Kevin&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/0_KkYTQwXh8MSSZnmC-300w.png 300w, https://rizafahmi.com/img/0_KkYTQwXh8MSSZnmC-600w.png 600w, https://rizafahmi.com/img/0_KkYTQwXh8MSSZnmC-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Indonesia DevC Leads with Kevin&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Demikianlah keseruan di H-1 F8. Tunggu cerita keseruan berikutnya ya :) Kalau mau dengar penuturan langsung dari kami yang berangkat, silakan join &lt;a href=&quot;https://www.facebook.com/groups/DevCJakarta/&quot;&gt;grup facebook DevC Jakarta&lt;/a&gt;. Kita akan mengadakan meetup khusus membahas tentang pengalaman kita di F8.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Kenapa Edukasi Yang Bagus Itu Tidak Murah Harganya</title>
    <link href="https://rizafahmi.com/2018/04/06/kenapa-edukasi-yang-bagus-itu-tidak-murah-harganya/"/>
    <updated>2018-04-06T00:00:00Z</updated>
    <pubDate>2018-04-06T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2018/04/06/kenapa-edukasi-yang-bagus-itu-tidak-murah-harganya/</id>
    <summary>Paradigma Bisnis Publishing VS Paradigma Bisnis Edukasi Dalam dunia produksi konten, ada dua paradigma bisnis industri konten: paradigma penerbit atau istilah kerennya publishing dan paradigma edukasi. Keduanya memiliki…</summary>
    <category term="catatan, edukasi, bisnis, opini, hacktiv8"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/4.jpg"/>
    <content type="html">&lt;h2&gt;Paradigma Bisnis Publishing VS Paradigma Bisnis Edukasi&lt;/h2&gt;
&lt;p&gt;Dalam dunia produksi konten, ada dua paradigma bisnis industri konten: paradigma penerbit atau istilah kerennya &lt;em&gt;publishing&lt;/em&gt; dan paradigma edukasi. Keduanya memiliki pasar dan ceruknya masing-masing. Akan tetapi ada yang menganggap keduanya adalah suatu hal yang sama dibawah payung edukasi. Meskipun mirip, kedua paradigma ini sebenarnya tidaklah sama. Artikel ini akan membahas tentang persamaan dan perbedaan keduanya.&lt;/p&gt;
&lt;h2&gt;Paradigma Bisnis Produksi Konten&lt;/h2&gt;
&lt;p&gt;Pernah membaca kisah tentang seorang bernama Nate Berkopec yang berhasil menjual &lt;em&gt;course&lt;/em&gt; (buku dan video) yang berjudul &lt;a href=&quot;https://www.railsspeed.com/&quot;&gt;The Complete Guide to Rails Performance&lt;/a&gt;? Di artikel &lt;a href=&quot;https://www.nateberkopec.com/blog/2017/03/10/how-i-made-self-publishing-about-ruby-on-rails.html&quot;&gt;ini dia berkisah&lt;/a&gt; bahwa dia berhasi menjual &lt;em&gt;course&lt;/em&gt; tersebut sebanyak 500 &lt;em&gt;copy&lt;/em&gt; dan mendapatkan keuntungan sebesar $70,714.20. Tujuh puluh ribu dollar, man! Siapa coba yang tidak terinspirasi dan tertarik mencoba.&lt;/p&gt;
&lt;p&gt;Banyak lagi cerita sukses dari para produser konten baik itu buku, buku elektronik, dan video course yang berhasil membuat kita berdecak kagum.
Istilah &lt;em&gt;information product&lt;/em&gt; atau produk informasi biasanya berkaitan dengan konten edukasi seperti buku, &lt;em&gt;ebook&lt;/em&gt;, &lt;em&gt;newsletter&lt;/em&gt;, blog, audio, video atau juga kombinasinya. Biasanya produk informasi ini dijual secara digital dan dijual via internet.&lt;/p&gt;
&lt;h3&gt;Distribusi Masif&lt;/h3&gt;
&lt;p&gt;Sisi positifnya harga dari sumber ilmu tersebut, baik itu buku, &lt;em&gt;video course&lt;/em&gt;, blog, podcast dan lain sebagainya menjadi terjangkau. Bahkan tidak jarang dibagikan secara gratis untuk tujuan satu atau lain hal. Kenapa produk-produk informasi bisa murah atau terjangkau? Salah satu alasannya karena produk-produk informasi tersebut dapat didistribusikan secara masif.&lt;/p&gt;
&lt;p&gt;Biaya produksi produk informasi seperti video, podcast, ataupun buku sebenarnya tidak murah. Akan tetapi karena dapat didistribusikan secara masif lintas daerah bahkan lintas negara, maka harganya dapat didistribusikan pula. Dosen saya pernah berkata: “Harganya memang murah, tapi faktor pengalinya yang banyak!”.&lt;/p&gt;
&lt;p&gt;Hal ini juga didukung oleh perubahan kiblat yang terjadi di dunia digital pada umumnya. Kalau dulu kita menjual aplikasi atau game dengan harga ratusan ribu rupiah, saat ini sebuah game premium dapat kita ‘tebus’ dengan harga sepulu ribuan saja!&lt;/p&gt;
&lt;h3&gt;Dampak Terhadap Kehidupan&lt;/h3&gt;
&lt;p&gt;Namun produk informasi ini juga memiliki kekurangan dari sisi pembeli. Seseorang membeli produk informasi ataupun mengikuti kegiatan workshop dan aneka sajian edukasi lainnya adalah bertujuan untuk meningkatkan skill dan kemampuannya. Dampak atau &lt;em&gt;impact&lt;/em&gt; yang didapat ketika kita membeli produk informasi hasilnya beragam. Ada yang berhasil, tentu. Akan tetapi tidak sedikit yang tidak berdampak apa-apa terhadap kehidupannya. Semua tergantung si pembeli itu sendiri.&lt;/p&gt;
&lt;p&gt;Ketika seseorang membeli sebuah produk informasi seperti buku, tanggung jawab si penerbit dan &lt;em&gt;author&lt;/em&gt; hanya sampai disitu. Mau bukunya dibaca, ataupun tidak, itu urusan si pemilik buku. Apakah bukunya dijadikan ganjalan pintu atau tatakan monitor juga tidak ada yang melarang. Tidak ada kewajiban dari pihak penulis ataupun penerbit untuk memastikan bahwa &lt;em&gt;impact&lt;/em&gt; terhadap perubahan hidup seseorang itu sesuai ekspektasinya. Tanggungjawab apakah ia sukses ataupun tidak hanya tergantung kepada si pembeli saja dalam hal ini.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/ruby-300w.webp 300w, https://rizafahmi.com/img/ruby-600w.webp 600w, https://rizafahmi.com/img/ruby-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/ruby-300w.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;675&quot; srcset=&quot;https://rizafahmi.com/img/ruby-300w.png 300w, https://rizafahmi.com/img/ruby-600w.png 600w, https://rizafahmi.com/img/ruby-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Sekarang mari kita lihat sisi yang lain, yaitu bisnis edukasi.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Semoga artikel ini dapat membantu kamu yang bertanya-tanya kenapa edukasi seperti bootcamp kok harganya tidak murah jika dibandingkan alternatif lain seperti buku, atau &lt;em&gt;online course&lt;/em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Paradigma Bisnis Edukasi&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Coding bootcamp&lt;/em&gt; sedang menjamur, baik diluar maupun didalam negeri. Keinginan seseorang untuk mentransformasi hidupnya dengan cepat menjadi salah satu alasan yang sering terdengar mengapa ia memilih mengikuti bootcamp, kursus, dan sejenisnya. Padahal biaya dan waktu yang dikeluarkan tidaklah sedikit.&lt;/p&gt;
&lt;p&gt;Apa yang menjadi pembeda antara bisnis produk informasi dengan bisnis edukasi seperti &lt;a href=&quot;http://hacktiv8.com/&quot;&gt;coding bootcamp&lt;/a&gt;? Dan kenapa perbedaan harganya cukup jomplang?&lt;/p&gt;
&lt;h3&gt;Biaya Operasional Yang Tinggi&lt;/h3&gt;
&lt;p&gt;Yang pasti perbedaan terbesar adalah modal yang dibutuhkan untuk membangun dan menjalankan bisnis edukasi tidaklah kecil. Bayangkan, kita harus memiliki atau menyewa tempat, memiliki lab komputer yang mumpuni, karyawan untuk segala hal dan yang tak kalah pentingya, adalah merekrut instruktur atau tenaga pengajar.&lt;/p&gt;
&lt;h3&gt;Bisnis Edukasi Bertanggungjawab Terhadap Hasil&lt;/h3&gt;
&lt;p&gt;Berbeda dengan produk informasi, bisnis edukasi ikut serta bertanggungjawab dalam memberikan dampak kepada kehidupan si pembeli. Dengan kata lain, tanggung jawab dibebankan kepada dua pihak: seorang yang mau belajar, dan pihak penyedia edukasi tersebut. Tentu si siswa yang ingin belajar harus punya niat dan motivasi untuk mengejar mimpinya (apapun itu), bangun pagi, datang tepat waktu dan belajar dengan sepenuh hati. Tapi di lain sisi, ada pihak penyedia edukasi yang juga mempunyai tanggungjawab untuk memastikan siswa sukses melewati berbagai rintangan pelajaran dengan memberikan rambu-rambu, mengingatkan, mengarahkan hingga siswa dapat belajar dengan baik. Itulah sebabnya universitas atau bahkan sekolah biayanya jauh lebih mahal dari buku atau &lt;em&gt;online course&lt;/em&gt;. Mereka harus membayar sewa gedung, operasional, mengurus akreditasi dan yang terpenting, PENGAJAR!&lt;/p&gt;
&lt;p&gt;Contoh yang cukup jelas misalnya, untuk menjadi seorang dokter dibutuhkan biaya dan waktu studi yang panjang dan lama. Untuk menjadi dokter kita HARUS kuliah dan kerja praktek. Tidak bisa semata hanya dengan membeli beberapa buku kedokteran, serta-merta kemudian kita menjadi dokter. Tentu, buku tersebut sangat berguna dan ilmunya sangat banyak yang bisa kita dapatkan, tapi juga kita tentu tidak bisa membuka praktek dokter umum setelah membaca buku-buku itu, kan?!&lt;/p&gt;
&lt;h3&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Cara dan media belajar saat ini sudah begitu banyak. Baik itu yang berupa produk informasi seperti &lt;em&gt;online course&lt;/em&gt;, buku, &lt;em&gt;video tutorial&lt;/em&gt;, artikel blog dan lain sebagainya hingga lembaga kursus, bootcamp, sekolah tinggi hingga kampus. Kembali lagi ke diri kita masing-masing mau memilih yang mana yang sesuai dengan keinginan, kemampuan dan cara belajar kita.&lt;/p&gt;
&lt;p&gt;Apabila kamu adalah seorang &lt;em&gt;self learner&lt;/em&gt; dan tidak butuh motivasi eksternal, silakan belajar sendiri dengan buku, online course dan lain sebagainya. Namun apabila kamu butuh bantuan untuk memotivasi, menjaga kamu agar tetap di jalur yang diinginkan serta dikelilingi oleh orang-orang yang sama-sama ingin sukses, maka pilihan seperti &lt;a href=&quot;http://hacktiv8.com/fullstack&quot;&gt;bootcamp&lt;/a&gt;, kursus ataupun kuliah bisa menjadi pilihan. Selamat belajar!&lt;/p&gt;
&lt;p&gt;Artikel ini pertama kali di-&lt;em&gt;publish&lt;/em&gt; di &lt;a href=&quot;https://blog.hacktiv8.com/edukasi-yang-bagus/&quot;&gt;https://blog.hacktiv8.com/edukasi-yang-bagus/&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>5 Kebiasaan Coding Yang Menjadikan Kamu Super Developer</title>
    <link href="https://rizafahmi.com/2017/05/11/5-kebiasaan-coding/"/>
    <updated>2017-05-11T00:00:00Z</updated>
    <pubDate>2017-05-11T00:00:00Z</pubDate>
    <id>https://rizafahmi.com/2017/05/11/5-kebiasaan-coding/</id>
    <summary>&quot;Genius is 1% talent and 99% percent hard work…&quot; — Albert Einstein Untuk menjadi developer handal tidak ada cara yang lebih baik daripada berlatih dan berlatih setiap hari. Berikut beberapa tips singkat…</summary>
    <category term="catatan, produktivitas, belajar, developer"/>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rizafahmi.com/1_JaLmTHV3SDIqTNaczZdhCQ.png"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Genius is 1% talent and 99% percent hard work…&amp;quot; — Albert Einstein&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Untuk menjadi developer handal tidak ada cara yang lebih baik daripada berlatih dan berlatih setiap hari.&lt;/p&gt;
&lt;p&gt;Berikut beberapa tips singkat berlatih coding setiap hari menyulap kamu menjadi developer yang lebih baik dirangkum dari beberapa artikel.&lt;/p&gt;
&lt;h2&gt;&lt;em&gt;Coding&lt;/em&gt; setiap hari&lt;/h2&gt;
&lt;p&gt;Sempatkan untuk &lt;em&gt;coding&lt;/em&gt; setiap hari. Tidak masalah bahasa pemrogramannya apa atau &lt;em&gt;project&lt;/em&gt;-nya apa. Yang penting usahakan untuk &lt;em&gt;coding&lt;/em&gt; setiap hari.&lt;/p&gt;
&lt;p&gt;Hal ini juga saya rasakan ketika saya tidak &lt;em&gt;coding&lt;/em&gt; dalam rentang waktu beberapa lama, terkadang ketika kembali &lt;em&gt;coding&lt;/em&gt; terasa sedikit lemot, seperti jetlag dan harus beradaptasi kembali dengan berbagai hal.&lt;/p&gt;
&lt;p&gt;Dengan melakukan latihan &lt;em&gt;coding&lt;/em&gt; setiap hari, kita menjaga momentum, &lt;em&gt;flow&lt;/em&gt; dan disiplin. Layaknya latihan yang diberikan oleh &lt;a href=&quot;http://www.imdb.com/character/ch0007693/?ref_=tt_cl_t2&quot;&gt;Mr. Miyagi&lt;/a&gt; dalam film &lt;a href=&quot;http://www.imdb.com/title/tt0087538/?ref_=nv_sr_1&quot;&gt;Karate Kid&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_kRDevrDff_QPZblFbodq6Q-300w.webp 300w, https://rizafahmi.com/img/1_kRDevrDff_QPZblFbodq6Q-400w.webp 400w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_kRDevrDff_QPZblFbodq6Q-300w.png&quot; alt=&quot;Wax&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;400&quot; height=&quot;400&quot; srcset=&quot;https://rizafahmi.com/img/1_kRDevrDff_QPZblFbodq6Q-300w.png 300w, https://rizafahmi.com/img/1_kRDevrDff_QPZblFbodq6Q-400w.png 400w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Pada awalnya latihan yang diberikan &lt;a href=&quot;http://www.imdb.com/character/ch0007693/?ref_=tt_cl_t2&quot;&gt;Mr. Miyagi&lt;/a&gt; dirasa tidak berguna oleh &lt;a href=&quot;http://www.imdb.com/name/nm0001494/?ref_=tt_cl_t1&quot;&gt;Daniel&lt;/a&gt; yang ingin segera belajar jurus dan ogah belajar fundamental. Tetapi dengan berlatih hal fundamental secara terus menerus melatih reflek dan naluri saat bertarung nantinya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pro tip&lt;/strong&gt;: Gunakan &lt;a href=&quot;https://github.com/rizafahmi&quot;&gt;GitHub&lt;/a&gt; agar profil kamu menjadi lebih keren!&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_VQ8vr7Atcmhc5U1Lz6H0RA-300w.webp 300w, https://rizafahmi.com/img/1_VQ8vr7Atcmhc5U1Lz6H0RA-600w.webp 600w, https://rizafahmi.com/img/1_VQ8vr7Atcmhc5U1Lz6H0RA-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_VQ8vr7Atcmhc5U1Lz6H0RA-300w.png&quot; alt=&quot;GitHub&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;246&quot; srcset=&quot;https://rizafahmi.com/img/1_VQ8vr7Atcmhc5U1Lz6H0RA-300w.png 300w, https://rizafahmi.com/img/1_VQ8vr7Atcmhc5U1Lz6H0RA-600w.png 600w, https://rizafahmi.com/img/1_VQ8vr7Atcmhc5U1Lz6H0RA-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2&gt;Cobalah sesuatu yang baru&lt;/h2&gt;
&lt;p&gt;Setiap beberapa bulan sekali, cobalah sesuatu yang baru. Bisa berupa bahasa pemrograman baru, editor baru, OS baru atau apapun.&lt;/p&gt;
&lt;p&gt;Cobalah sesuatu yang kamu bahkan tidak yakin kamu akan sukai. Tantang diri kamu dan keluar dari zona nyaman. Katakanlah kamu tidak menyukai Microsoft, cobalah menggunakan C#, TypeScript atau produk Microsoft lainnya. Atau tidak suka Apple? Cobalah Swift ataupun Objective-C. Kamu fans &lt;a href=&quot;http://www.vim.org/&quot;&gt;VIM&lt;/a&gt;? Cobalah &lt;a href=&quot;https://www.gnu.org/software/emacs/&quot;&gt;Emacs&lt;/a&gt; :)&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_BKEg9Xihnj-9IMa7KeuVqQ-300w.webp 300w, https://rizafahmi.com/img/1_BKEg9Xihnj-9IMa7KeuVqQ-600w.webp 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_BKEg9Xihnj-9IMa7KeuVqQ-300w.png&quot; alt=&quot;Challenge Accepted!&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;600&quot; height=&quot;337&quot; srcset=&quot;https://rizafahmi.com/img/1_BKEg9Xihnj-9IMa7KeuVqQ-300w.png 300w, https://rizafahmi.com/img/1_BKEg9Xihnj-9IMa7KeuVqQ-600w.png 600w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Latihan ini akan membuat kita belajar berfikir &lt;em&gt;out-of-the-box&lt;/em&gt; dengan cara memantang dirimu setiap kesempatan. Pasti ada sesuatu yang dapat kita pelajari dari berbagai bahasa ataupun platform yang berbeda.&lt;/p&gt;
&lt;p&gt;Hal ini juga pernah saya alami. Ketika pertama kali belajar bahasa pemrograman fungsional &lt;a href=&quot;https://www.erlang.org/&quot;&gt;Erlang&lt;/a&gt;, saya merasa pusing, mual dan ingin muntah :) Tetapi setelah beberapa waktu, setelah belajar &lt;a href=&quot;http://elixirdose.com/&quot;&gt;Elixir&lt;/a&gt; sekarang &lt;em&gt;code&lt;/em&gt; &lt;a href=&quot;https://www.erlang.org/&quot;&gt;Erlang&lt;/a&gt; tidak lagi begitu menyeramkan.&lt;/p&gt;
&lt;h2&gt;Ikuti dan terapkan paradigma di setiap bahasa atau platform&lt;/h2&gt;
&lt;p&gt;Masih berkaitan dengan tips sebelumnya, ketika mencoba bahasa, paradigma atau platform baru, gunakanlah se-&lt;em&gt;idiomatic&lt;/em&gt; mungkin. Kita mencoba sesuatu yang baru tujuannya untuk belajar dan dengan belajar idiom baru, kita juga dapat lebih mengerti mengapa bahasa pemrograman satu berbeda dengan bahasa pemrograman lainnya.&lt;/p&gt;
&lt;p&gt;Sebagai contoh, cobalah untuk se-object-oriented mungkin ketika mencoba &lt;a href=&quot;https://www.java.com/en/&quot;&gt;Java&lt;/a&gt; atau &lt;a href=&quot;https://kotlinlang.org/&quot;&gt;Kotlin&lt;/a&gt; karena memang naturalnya seperti itu.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_7xaVHJnd8-oALSGcc9di8g-300w.webp 300w, https://rizafahmi.com/img/1_7xaVHJnd8-oALSGcc9di8g-600w.webp 600w, https://rizafahmi.com/img/1_7xaVHJnd8-oALSGcc9di8g-1200w.webp 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_7xaVHJnd8-oALSGcc9di8g-300w.png&quot; alt=&quot;Flow&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;900&quot; srcset=&quot;https://rizafahmi.com/img/1_7xaVHJnd8-oALSGcc9di8g-300w.png 300w, https://rizafahmi.com/img/1_7xaVHJnd8-oALSGcc9di8g-600w.png 600w, https://rizafahmi.com/img/1_7xaVHJnd8-oALSGcc9di8g-1200w.png 1200w&quot; sizes=&quot;100vw&quot; /&gt;&lt;/picture&gt;&lt;em&gt;Flow&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Setelah beberapa lama, kembali lakukan eksperimen. Gunakan sebuah bahasa dengan cara yang berbeda. Misalnya hindari penggunaan &lt;em&gt;for loop&lt;/em&gt; di Ruby dan gunakan metode rekursif untuk melatih &lt;em&gt;mindset&lt;/em&gt; &lt;em&gt;functional programming&lt;/em&gt;. Berkreasilah!&lt;/p&gt;
&lt;h2&gt;Manfaat belajar paradigma baru&lt;/h2&gt;
&lt;p&gt;Ada beberapa kalangan yang percaya belajar &lt;em&gt;functional programming&lt;/em&gt; akan mengubah kamu menjadi &lt;em&gt;developer&lt;/em&gt; yang lebih rapi dalam menulis* code*. Kenapa? Karena di dalam &lt;em&gt;functional programming&lt;/em&gt; kita ‘dipaksa’ berpikir bagaimana mengubah sebuah data yang di input ke sebuah fungsi dan me &lt;em&gt;return&lt;/em&gt; hasilnya.&lt;/p&gt;
&lt;p&gt;Cara-cara atau trik di &lt;em&gt;functional programming&lt;/em&gt; tentu dapat digunakan di paradigma lainnya dan akan bermanfaat membuat code yang lebih baik ketika kamu menulis &lt;em&gt;code&lt;/em&gt; di bahasa pemrograman yang kamu gunakan sehari-hari.&lt;/p&gt;
&lt;p&gt;Contoh lain misalnya dengan belajar &lt;em&gt;declarative programming&lt;/em&gt; dapat meningkatkan pemahaman kita terhadap &lt;em&gt;immutability&lt;/em&gt; dan lain sebagainya.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://rizafahmi.com/img/1_YUiRR_4_3APukZla90hZNA-300w.webp 300w&quot; sizes=&quot;100vw&quot; /&gt;&lt;img src=&quot;https://rizafahmi.com/img/1_YUiRR_4_3APukZla90hZNA-300w.png&quot; alt=&quot;New is always better&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;300&quot; height=&quot;450&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Banyak pula praktek-praktek OOP yang bisa digunakan di &lt;em&gt;functional programming&lt;/em&gt; maupun paradigma-paradigma lainnya.&lt;/p&gt;
&lt;p&gt;Contohnya video singkat nan lucu berikut yang berjudul “Advanced OOP in Elixir” oleh Wojtek Mach di &lt;a href=&quot;http://www.elixirconf.eu/elixirconf2016&quot;&gt;ElixirConfEU 2016&lt;/a&gt; yang lalu. Sangat &lt;em&gt;out-of-the-box&lt;/em&gt;!&lt;/p&gt;
&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/5EtV2JUU0Z4&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
&lt;h2&gt;Latihan repetisi dengan Code Katas&lt;/h2&gt;
&lt;p&gt;Istilah &lt;em&gt;katas&lt;/em&gt; adalah ungkapan bahasa Jepang yang artinya melatih gerakan dalam konteks bela diri. &lt;em&gt;Code katas&lt;/em&gt; adalah latihan &lt;em&gt;coding&lt;/em&gt; untuk mengasah &lt;em&gt;skill programming&lt;/em&gt; kamu melalui latihan dan repetisi.&lt;/p&gt;
&lt;p&gt;Repetisi penting untuk melatih otot memori kita agar dapat secara cepat dan melatih ‘reflek’ kita dalam programming. Repetisi sangat dibutuhkan untuk menguasai sesuatu. Seperti analogi Mr. Miyagi diatas.&lt;/p&gt;
&lt;p&gt;Berikut adalah quote dari salah satu tokoh idola saya, &lt;a href=&quot;http://kadavy.net/&quot;&gt;David Kadavy&lt;/a&gt; tentang repetisi yang dikutip dari artikel yang berjudul &lt;a href=&quot;https://mystudentvoices.com/the-powerful-power-of-repetition-820adee3ecfe#.4qz3w317s&quot;&gt;The Powerful Power of Repetition&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;The Powerful Power of Repetition &lt;a href=&quot;https://t.co/Wlzi2Pgb8o&quot;&gt;https://t.co/Wlzi2Pgb8o&lt;/a&gt; &lt;a href=&quot;https://t.co/XFtdxCnbHS&quot;&gt;pic.twitter.com/XFtdxCnbHS&lt;/a&gt;&lt;/p&gt;&amp;mdash; David Kadavy (@kadavy) &lt;a href=&quot;https://twitter.com/kadavy/status/717341759999774721?ref_src=twsrc%5Etfw&quot;&gt;April 5, 2016&lt;/a&gt;&lt;/blockquote&gt;&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;Beberapa coding bootcamp seperti &lt;a href=&quot;http://www.hackreactor.com/&quot;&gt;HackReactor&lt;/a&gt; dan &lt;a href=&quot;https://hacktiv8.com/&quot;&gt;Hacktiv8&lt;/a&gt; pun menyarankan &lt;em&gt;students&lt;/em&gt;-nya untuk berlatih &lt;em&gt;code katas&lt;/em&gt; setiap hari. Bahkan beberapa perusahaan saat ini menggunakan soal-soal dan website &lt;em&gt;code katas&lt;/em&gt; sebagai referensi.&lt;/p&gt;
&lt;p&gt;Beberapa website yang dapat kamu gunakan diantaranya:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://codekata.com/&quot;&gt;http://codekata.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.codewars.com/&quot;&gt;https://www.codewars.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://coderbyte.com/&quot;&gt;https://coderbyte.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.codingame.com/home&quot;&gt;https://www.codingame.com/home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codefights.com/&quot;&gt;https://codefights.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.hackerrank.com/&quot;&gt;https://www.hackerrank.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bahkan website &lt;a href=&quot;https://www.hackerrank.com/&quot;&gt;HackerRank&lt;/a&gt; mengadakan tantangan 30 days of code yang bisa kita ikuti untuk melakukan kegiatan #alwaysBeCoding.&lt;/p&gt;
&lt;h2&gt;Referensi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.jupiterbroadcasting.com/107311/always-be-coding-cr-247/&quot;&gt;Why coding everyday makes a big difference, Coder Radio, Always Be Coding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/always-be-coding/abc-always-be-coding-d5f8051afce2#.sdh1eygvw&quot;&gt;ABC — Always Be Coding, David Byttow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.humblecoder.com/5-reasons-to-always-be-coding/&quot;&gt;5 Reasons To Always be Coding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mystudentvoices.com/the-powerful-power-of-repetition-820adee3ecfe#---5-290.9ofans17m&quot;&gt;The powerful power of repetition, David Kadavy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
</feed>
