<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss/feed.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Erlk1m Blog</title><description>Catatan Linux, Armbian, Docker, Rust &amp; AI</description><link>https://webku-7lt.pages.dev</link><language>ja</language><item><title>Tutorial Rust WebAssembly (WASM): Menjalankan Kode Rust di Browser untuk Pemula</title><link>https://webku-7lt.pages.dev/ja/post/tutorial-rust-webassembly-wasm-untuk-pemula</link><guid isPermaLink="false">ja:tutorial-rust-webassembly-wasm-untuk-pemula</guid><description>Panduan praktis belajar WebAssembly (WASM) dengan Rust dari nol. Pelajari cara kompilasi kode Rust menjadi WebAssembly, integrasi dengan JavaScript, dan menjalankannya langsung di browser.</description><pubDate>Fri, 06 Nov 2026 19:55:00 GMT</pubDate><content:encoded>&lt;h2&gt;Pendahuluan&lt;a href=&quot;#pendahuluan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;WebAssembly (WASM)&lt;/strong&gt; telah merevolusi kemampuan browser modern. Jika sebelumnya JavaScript adalah satu-satunya bahasa pemrograman yang dapat berjalan langsung di sisi client (browser), kini WebAssembly memungkinkan kita menjalankan kode biner berkecepatan tinggi dengan performa mendekati native (&lt;em&gt;near-native speed&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Dari sekian banyak bahasa pemrograman yang mendukung kompilasi ke WebAssembly, &lt;strong&gt;Rust&lt;/strong&gt; adalah pilihan yang paling populer dan matang. Mengapa?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tanpa Garbage Collector (GC):&lt;/strong&gt; Rust menggunakan sistem &lt;em&gt;ownership&lt;/em&gt; untuk manajemen memori, sehingga runtime WASM sangat ramping tanpa overhead jeda GC.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ukuran Binary Sangat Kecil:&lt;/strong&gt; Hanya modul yang benar-benar digunakan yang disertakan dalam output WASM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ekosistem Terbaik:&lt;/strong&gt; Tools seperti &lt;code&gt;wasm-pack&lt;/code&gt; dan library &lt;code&gt;wasm-bindgen&lt;/code&gt; membuat komunikasi dua arah antara Rust dan JavaScript terasa sangat mulus.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aman dan Andal:&lt;/strong&gt; Menghindari &lt;em&gt;memory leak&lt;/em&gt; dan kesalahan akses memori sejak fase kompilasi.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;p&gt;WebAssembly dirancang bukan untuk menggantikan JavaScript, melainkan untuk &lt;strong&gt;bekerja berdampingan&lt;/strong&gt; dengan JavaScript. Gunakan JavaScript untuk manipulasi DOM dan routing, serta gunakan WebAssembly untuk komputasi berat, manipulasi media, enkripsi, dan grafis!&lt;/p&gt;
&lt;/div&gt;
&lt;hr /&gt;
&lt;h2&gt;Prasyarat dan Instalasi Toolchain&lt;a href=&quot;#prasyarat-dan-instalasi-toolchain&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sebelum mulai, pastikan komputer Anda sudah terpasang perangkat lunak berikut:&lt;/p&gt;
&lt;h3&gt;Rust dan Cargo&lt;a href=&quot;#rust-dan-cargo&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Jika belum memiliki Rust, pasang melalui toolchain resmi:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# Untuk Linux / macOS / WSL&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; --proto&lt;/span&gt;&lt;span&gt; &apos;=https&apos;&lt;/span&gt;&lt;span&gt; --tlsv1.2&lt;/span&gt;&lt;span&gt; -sSf&lt;/span&gt;&lt;span&gt; https://sh.rustup.rs&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; sh&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Verifikasi instalasi&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;rustc&lt;/span&gt;&lt;span&gt; --version&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; --version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;WASM Target&lt;a href=&quot;#wasm-target&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Tambahkan target kompilasi WebAssembly ke toolchain Rust Anda:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rustup&lt;/span&gt;&lt;span&gt; target&lt;/span&gt;&lt;span&gt; add&lt;/span&gt;&lt;span&gt; wasm32-unknown-unknown&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;wasm-pack&lt;a href=&quot;#wasm-pack&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;wasm-pack&lt;/code&gt; adalah tool serbaguna untuk membangun, mengemas, dan mengoptimalkan package WebAssembly Rust agar siap dikonsumsi oleh JavaScript / bundler web.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; wasm-pack&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Langkah 1: Inisialisasi Project Rust&lt;a href=&quot;#langkah-1-inisialisasi-project-rust&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Buat sebuah library Rust baru menggunakan Cargo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; --lib&lt;/span&gt;&lt;span&gt; rust-wasm-demo&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; rust-wasm-demo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Struktur folder awal yang dihasilkan:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rust-wasm-demo/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── Cargo.toml&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;└── src/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    └── lib.rs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Langkah 2: Konfigurasi Cargo.toml&lt;a href=&quot;#langkah-2-konfigurasi-cargotoml&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Buka file &lt;code&gt;Cargo.toml&lt;/code&gt; dan sesuaikan kodenya. Kita perlu memberitahu Cargo agar mengompilasi project ini sebagai &lt;code&gt;cdylib&lt;/code&gt; (C dynamic library) dan menyertakan dependensi &lt;code&gt;wasm-bindgen&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;package&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;name = &lt;/span&gt;&lt;span&gt;&quot;rust-wasm-demo&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;version = &lt;/span&gt;&lt;span&gt;&quot;0.1.0&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;edition = &lt;/span&gt;&lt;span&gt;&quot;2021&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;lib&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;crate-type = [&lt;/span&gt;&lt;span&gt;&quot;cdylib&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;wasm-bindgen = &lt;/span&gt;&lt;span&gt;&quot;0.2&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;p&gt;&lt;code&gt;crate-type = [&quot;cdylib&quot;]&lt;/code&gt; wajib disertakan agar compiler Rust menghasilkan file biner &lt;code&gt;.wasm&lt;/code&gt; yang dapat diekspor, bukan pustaka Rust standar (&lt;code&gt;rlib&lt;/code&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;hr /&gt;
&lt;h2&gt;Langkah 3: Menulis Kode Rust&lt;a href=&quot;#langkah-3-menulis-kode-rust&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Buka file &lt;code&gt;src/lib.rs&lt;/code&gt; dan ganti isinya dengan kode berikut:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; wasm_bindgen&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;prelude&lt;/span&gt;&lt;span&gt;::*&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// Mengimpor fungsi `alert` dari Web API (JavaScript window)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[wasm_bindgen]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;extern&lt;/span&gt;&lt;span&gt; &quot;C&quot;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; alert&lt;/span&gt;&lt;span&gt;(s&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// Fungsi 1: Menampilkan popup browser dari Rust&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[wasm_bindgen]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pub&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; sapa&lt;/span&gt;&lt;span&gt;(nama&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    alert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Halo {}! Salam dari kode Rust di WebAssembly &quot;&lt;/span&gt;&lt;span&gt;, nama));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// Fungsi 2: Komputasi berat (Fibonacci Rekursif) untuk uji performa&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[wasm_bindgen]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pub&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; hitung_fibonacci&lt;/span&gt;&lt;span&gt;(n&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    match&lt;/span&gt;&lt;span&gt; n {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        0&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        1&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        _ &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; hitung_fibonacci&lt;/span&gt;&lt;span&gt;(n &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; hitung_fibonacci&lt;/span&gt;&lt;span&gt;(n &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// Fungsi 3: Operasi manipulasi string sederhana&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[wasm_bindgen]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pub&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; balik_kata&lt;/span&gt;&lt;span&gt;(teks&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    teks&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;chars&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;rev&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;collect&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Makro &lt;code&gt;#[wasm_bindgen]&lt;/code&gt; bertugas otomatis menangani &lt;em&gt;marshalling&lt;/em&gt; tipe data kompleks seperti &lt;code&gt;String&lt;/code&gt; dan &lt;code&gt;&amp;amp;str&lt;/code&gt; agar bisa dimengerti oleh runtime JavaScript.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Langkah 4: Kompilasi ke WebAssembly dengan wasm-pack&lt;a href=&quot;#langkah-4-kompilasi-ke-webassembly-dengan-wasm-pack&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Jalankan perintah berikut di direktori project:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;wasm-pack&lt;/span&gt;&lt;span&gt; build&lt;/span&gt;&lt;span&gt; --target&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Perintah di atas akan membuat folder baru bernama &lt;code&gt;pkg/&lt;/code&gt; yang berisi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rust_wasm_demo_bg.wasm&lt;/code&gt;: File biner WebAssembly hasil kompilasi.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rust_wasm_demo.js&lt;/code&gt;: Wrapper JavaScript ES Module untuk memuat dan mengikat fungsi-fungsi WASM.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rust_wasm_demo.d.ts&lt;/code&gt;: TypeScript definition untuk auto-complete editor.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;package.json&lt;/code&gt;: Metadata package jika ingin dipublikasikan ke npm.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Langkah 5: Membuat Antarmuka Web (HTML &amp;amp; JavaScript)&lt;a href=&quot;#langkah-5-membuat-antarmuka-web-html--javascript&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sekarang buat file &lt;code&gt;index.html&lt;/code&gt; di root project untuk menguji modul WASM yang sudah dibuat:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;!&lt;/span&gt;&lt;span&gt;DOCTYPE&lt;/span&gt;&lt;span&gt; html&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt; lang&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; charset&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;viewport&quot;&lt;/span&gt;&lt;span&gt; content&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;width=device-width, initial-scale=1.0&quot;&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;Uji Coba Rust WebAssembly&amp;lt;/&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    body&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      font-family&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;system-ui&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;-apple-system&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;sans-serif&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      max-width&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;600&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      margin&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;40&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt; auto&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      padding&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; 20&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      line-height&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1.6&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    input&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;button&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      padding&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt; 14&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      font-size&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;14&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      margin&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .card&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      border&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt; solid&lt;/span&gt;&lt;span&gt; #e2e8f0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      border-radius&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      padding&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;16&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      margin-bottom&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      background&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;#f8fafc&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;/&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;h1&lt;/span&gt;&lt;span&gt;&amp;gt; Demo Rust WebAssembly&amp;lt;/&lt;/span&gt;&lt;span&gt;h1&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;&amp;gt;Semua logika di bawah dieksekusi langsung oleh WebAssembly di browser Anda.&amp;lt;/&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;!-- Bagian 1: Sapaan --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;card&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;h3&lt;/span&gt;&lt;span&gt;&amp;gt;1. Panggil Web API (Alert)&amp;lt;/&lt;/span&gt;&lt;span&gt;h3&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;text&quot;&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;inputNama&quot;&lt;/span&gt;&lt;span&gt; placeholder&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;Masukkan nama Anda...&quot;&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;Developer&quot;&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;br&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;button&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;btnSapa&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;Kirim Sapaan&amp;lt;/&lt;/span&gt;&lt;span&gt;button&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;!-- Bagian 2: Balik Kata --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;card&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;h3&lt;/span&gt;&lt;span&gt;&amp;gt;2. Manipulasi String (Reverse)&amp;lt;/&lt;/span&gt;&lt;span&gt;h3&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;text&quot;&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;inputText&quot;&lt;/span&gt;&lt;span&gt; placeholder&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;Ketik kalimat...&quot;&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;Halo Dunia&quot;&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;br&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;button&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;btnBalik&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;Balik Teks&amp;lt;/&lt;/span&gt;&lt;span&gt;button&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;&amp;gt;Hasil: &amp;lt;&lt;/span&gt;&lt;span&gt;strong&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;hasilBalik&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;-&amp;lt;/&lt;/span&gt;&lt;span&gt;strong&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;!-- Bagian 3: Komputasi Fibonacci --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;card&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;h3&lt;/span&gt;&lt;span&gt;&amp;gt;3. Uji Kecepatan Komputasi (Fibonacci)&amp;lt;/&lt;/span&gt;&lt;span&gt;h3&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;number&quot;&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;inputFibo&quot;&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;35&quot;&lt;/span&gt;&lt;span&gt; min&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;1&quot;&lt;/span&gt;&lt;span&gt; max&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;45&quot;&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;br&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;button&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;btnFibo&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;Hitung dengan Rust&amp;lt;/&lt;/span&gt;&lt;span&gt;button&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;&amp;gt;Hasil: &amp;lt;&lt;/span&gt;&lt;span&gt;strong&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;hasilFibo&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;-&amp;lt;/&lt;/span&gt;&lt;span&gt;strong&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span&gt;small&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;durasiFibo&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;small&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;module&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Import loader dan fungsi langsung dari folder pkg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    import&lt;/span&gt;&lt;span&gt; init, { sapa, balik_kata, hitung_fibonacci } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;./pkg/rust_wasm_demo.js&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    async&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      // Inisialisasi modul WASM&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      await&lt;/span&gt;&lt;span&gt; init&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      console.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Modul WebAssembly berhasil dimuat!&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      // Event Sapaan&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      document.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;btnSapa&apos;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;click&apos;&lt;/span&gt;&lt;span&gt;, () &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        const&lt;/span&gt;&lt;span&gt; nama&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; document.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;inputNama&apos;&lt;/span&gt;&lt;span&gt;).value;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        sapa&lt;/span&gt;&lt;span&gt;(nama);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      });&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      // Event Balik Kata&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      document.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;btnBalik&apos;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;click&apos;&lt;/span&gt;&lt;span&gt;, () &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        const&lt;/span&gt;&lt;span&gt; teks&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; document.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;inputText&apos;&lt;/span&gt;&lt;span&gt;).value;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        const&lt;/span&gt;&lt;span&gt; hasil&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; balik_kata&lt;/span&gt;&lt;span&gt;(teks);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        document.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;hasilBalik&apos;&lt;/span&gt;&lt;span&gt;).textContent &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; hasil;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      });&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      // Event Uji Fibonacci&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      document.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;btnFibo&apos;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;click&apos;&lt;/span&gt;&lt;span&gt;, () &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        const&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; parseInt&lt;/span&gt;&lt;span&gt;(document.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;inputFibo&apos;&lt;/span&gt;&lt;span&gt;).value, &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        const&lt;/span&gt;&lt;span&gt; mulai&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; performance.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        const&lt;/span&gt;&lt;span&gt; hasil&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; hitung_fibonacci&lt;/span&gt;&lt;span&gt;(n);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        const&lt;/span&gt;&lt;span&gt; selesai&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; performance.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        document.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;hasilFibo&apos;&lt;/span&gt;&lt;span&gt;).textContent &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; hasil;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        document.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;durasiFibo&apos;&lt;/span&gt;&lt;span&gt;).textContent &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          `Waktu eksekusi Rust WASM: ${&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;selesai&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; mulai&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;toFixed&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;} ms`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      });&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    run&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Langkah 6: Menjalankan Local Web Server&lt;a href=&quot;#langkah-6-menjalankan-local-web-server&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Karena WebAssembly memuat file &lt;code&gt;.wasm&lt;/code&gt; secara asinkron menggunakan protokol &lt;code&gt;fetch&lt;/code&gt;, browser tidak mengizinkan membukanya langsung via &lt;code&gt;file://&lt;/code&gt;. Anda perlu menjalankannya lewat web server lokal:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# Menggunakan Python&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;python3&lt;/span&gt;&lt;span&gt; -m&lt;/span&gt;&lt;span&gt; http.server&lt;/span&gt;&lt;span&gt; 8080&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Atau menggunakan npx serve&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buka browser Anda di &lt;code&gt;http://localhost:8080&lt;/code&gt; dan Anda akan melihat antarmuka interaktif yang ditenagai oleh Rust!&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Kapan Sebaiknya Menggunakan WebAssembly?&lt;a href=&quot;#kapan-sebaiknya-menggunakan-webassembly&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Meskipun WebAssembly sangat cepat, bukan berarti semua kode JavaScript harus diganti dengan WASM. WebAssembly sangat tepat digunakan untuk skenario:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pemrosesan Gambar &amp;amp; Audio/Video:&lt;/strong&gt; Manipulasi kanvas, filter foto, atau encoder/decoder video (misalnya ffmpeg WASM).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Game &amp;amp; Grafis 3D:&lt;/strong&gt; Menggunakan WebGL / WebGPU dengan game engine seperti Bevy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kriptografi &amp;amp; Enkripsi:&lt;/strong&gt; Hashing data besar, enkripsi end-to-end, dan pemrosesan kunci privat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parsing Format Kompleks:&lt;/strong&gt; Parser dokumen (PDF, Markdown, Spreadsheet) berukuran raksasa.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Porting Library Native C/C++/Rust:&lt;/strong&gt; Menjalankan library desktop yang sudah ada langsung di web tanpa menulis ulang dari nol.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Tips Optimasi Ukuran File WASM&lt;a href=&quot;#tips-optimasi-ukuran-file-wasm&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Untuk deployment ke lingkungan produksi, ukuran file biner &lt;code&gt;.wasm&lt;/code&gt; bisa diperkecil drastis dengan menambahkan profil release di &lt;code&gt;Cargo.toml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;profile&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;release&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;opt-level = &lt;/span&gt;&lt;span&gt;&quot;z&quot;&lt;/span&gt;&lt;span&gt;     # Optimalkan ukuran binary sekecil mungkin&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;lto = &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;          # Link Time Optimization antar modul&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;codegen-units = &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;   # Maksimalkan reduksi ukuran&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;panic = &lt;/span&gt;&lt;span&gt;&quot;abort&quot;&lt;/span&gt;&lt;span&gt;     # Hapus pesan unwind panic untuk memangkas bytes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kompilasi mode produksi:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;wasm-pack&lt;/span&gt;&lt;span&gt; build&lt;/span&gt;&lt;span&gt; --target&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt; --release&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;p&gt;Dengan optimasi di atas, ukuran file &lt;code&gt;.wasm&lt;/code&gt; hasil kompilasi bisa menyusut hingga lebih dari &lt;strong&gt;60%&lt;/strong&gt;, membuat proses download di browser client menjadi sangat instan!&lt;/p&gt;
&lt;/div&gt;
&lt;hr /&gt;
&lt;h2&gt;Kesimpulan&lt;a href=&quot;#kesimpulan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Menggabungkan Rust dan WebAssembly membuka jalan baru untuk membangun aplikasi web berperforma tinggi. Dengan ekosistem &lt;code&gt;wasm-bindgen&lt;/code&gt; dan &lt;code&gt;wasm-pack&lt;/code&gt;, proses integrasi ke aplikasi web modern menjadi sangat intuitif tanpa mengorbankan keamanan memori khas Rust.&lt;/p&gt;
&lt;p&gt;Selamat mencoba, dan mulailah membawa kekuatan komputasi native ke dalam browser Anda!&lt;/p&gt;</content:encoded><category>category:rust</category><category>tag:rust</category><category>tag:tutorial</category></item><item><title>Docker: Container untuk Modern Development</title><link>https://webku-7lt.pages.dev/ja/post/docker-container-modern-development</link><guid isPermaLink="false">ja:docker-container-modern-development</guid><description>Docker merevolusi cara developer membangun dan menjalankan aplikasi dengan teknologi container yang ringan, portabel, dan konsisten di berbagai lingkungan.</description><pubDate>Tue, 16 Jun 2026 02:30:00 GMT</pubDate><content:encoded/></item><item><title>ChatGPT: Revolusi Kecerdasan Buatan yang Mengubah Cara Kita Bekerja dan Belajar</title><link>https://webku-7lt.pages.dev/ja/post/chatgpt-revolusi-kecerdasan-buatan</link><guid isPermaLink="false">ja:chatgpt-revolusi-kecerdasan-buatan</guid><pubDate>Tue, 16 Jun 2026 02:00:00 GMT</pubDate><content:encoded/></item><item><title>test 12345</title><link>https://webku-7lt.pages.dev/ja/post/test-12345</link><guid isPermaLink="false">ja:test-12345</guid><description>123</description><pubDate>Tue, 16 Jun 2026 00:25:00 GMT</pubDate><content:encoded/><category>category:AI</category><category>tag:tutorial</category></item><item><title>MiMo V2.5 Pro — Model AI Terkuat Xiaomi yang Menyaingi Frontier Model Dunia</title><link>https://webku-7lt.pages.dev/ja/post/mi-mo-v2-5-pro-model-ai-terkuat-xiaomi-yang-menyaingi-frontier-model-dunia</link><guid isPermaLink="false">ja:mi-mo-v2-5-pro-model-ai-terkuat-xiaomi-yang-menyaingi-frontier-model-dunia</guid><description>Ulasan lengkap MiMo V2.5 Pro, model AI trillion-parameter dari Xiaomi dengan   arsitektur MoE 42B active params. Benchmark, harga, kemampuan agentic, dan   cara deploy-nya.</description><pubDate>Mon, 15 Jun 2026 23:24:00 GMT</pubDate><content:encoded>&lt;h1&gt;MiMo V2.5 Pro — Model AI Terkuat Xiaomi yang Menyaingi Frontier Model Dunia&lt;a href=&quot;#mimo-v25-pro--model-ai-terkuat-xiaomi-yang-menyaingi-frontier-model-dunia&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;Pendahuluan&lt;a href=&quot;#pendahuluan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Xiaomi bukan sekadar perusahaan smartphone. Dengan dirilisnya &lt;strong&gt;MiMo V2.5 Pro&lt;/strong&gt; pada 22 April 2026, Xiaomi membuktikan bahwa mereka mampu membangun model bahasa yang bersaing di level frontier global. Model ini menjadi &lt;strong&gt;open weights model pertama&lt;/strong&gt; yang menyamai performa model proprietary terdepan dalam benchmark agentic.&lt;/p&gt;
&lt;p&gt;Dengan lebih dari &lt;strong&gt;1 triliun parameter total&lt;/strong&gt; namun hanya mengaktifkan &lt;strong&gt;42 miliar parameter&lt;/strong&gt; per inference pass, MiMo V2.5 Pro menawarkan kombinasi langka: kecerdasan tingkat frontier dengan biaya inferensi yang sangat efisien.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Spesifikasi Utama&lt;a href=&quot;#spesifikasi-utama&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Spesifikasi&lt;/th&gt;&lt;th&gt;Detail&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Total Parameter&lt;/td&gt;&lt;td&gt;1.02T (Mixture-of-Experts)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Parameter Aktif&lt;/td&gt;&lt;td&gt;42B per forward pass&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Context Window&lt;/td&gt;&lt;td&gt;1M token&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Arsitektur&lt;/td&gt;&lt;td&gt;Hybrid Attention (SWA + GA, rasio 6&lt;div&gt;&lt;/div&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Multi-Token Prediction&lt;/td&gt;&lt;td&gt;3 layer MTP (triple output speed)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pelatihan&lt;/td&gt;&lt;td&gt;27T token, FP8 mixed precision&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Lisensi&lt;/td&gt;&lt;td&gt;MIT (open weights)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Harga API&lt;/td&gt;&lt;td&gt;&lt;span&gt;&lt;span&gt;1.00input/1.00 input / &lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1.00&lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;3.00 output per 1M token&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;Arsitektur: Hybrid Attention + Mixture-of-Experts&lt;a href=&quot;#arsitektur-hybrid-attention--mixture-of-experts&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Hybrid Attention&lt;a href=&quot;#hybrid-attention&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;MiMo V2.5 Pro menggunakan arsitektur &lt;strong&gt;hybrid attention&lt;/strong&gt; yang menggabungkan dua jenis mekanisme perhatian:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sliding Window Attention (SWA)&lt;/strong&gt; — 60 layer, untuk efisiensi pada konteks lokal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global Attention (GA)&lt;/strong&gt; — 10 layer, untuk memahami hubungan jarak jauh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dengan rasio 6&lt;/p&gt;&lt;div&gt;&lt;/div&gt; (SWA&lt;div&gt;&lt;/div&gt;), penyimpanan KV-cache berkurang hampir &lt;strong&gt;7x&lt;/strong&gt; tanpa mengorbankan performa konteks panjang.&lt;p&gt;&lt;/p&gt;




























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Komponen Arsitektur&lt;/th&gt;&lt;th&gt;MiMo V2.5 Pro&lt;/th&gt;&lt;th&gt;MiMo V2.5&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Total Parameter&lt;/td&gt;&lt;td&gt;1.02T&lt;/td&gt;&lt;td&gt;310B&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Parameter Aktif&lt;/td&gt;&lt;td&gt;42B&lt;/td&gt;&lt;td&gt;15B&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Hidden Size&lt;/td&gt;&lt;td&gt;6144&lt;/td&gt;&lt;td&gt;4096&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Jumlah Layer&lt;/td&gt;&lt;td&gt;70 (1 dense + 69 MoE)&lt;/td&gt;&lt;td&gt;48 (1 dense + 47 MoE)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Full Attention Layer&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SWA Layer&lt;/td&gt;&lt;td&gt;60&lt;/td&gt;&lt;td&gt;39&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Attention Heads&lt;/td&gt;&lt;td&gt;128&lt;/td&gt;&lt;td&gt;64&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;KV Heads&lt;/td&gt;&lt;td&gt;8 (GQA)&lt;/td&gt;&lt;td&gt;8 (GA) / 4 (SWA)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Routed Experts&lt;/td&gt;&lt;td&gt;384&lt;/td&gt;&lt;td&gt;256&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Expert per Token&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Multi-Token Prediction (MTP)&lt;a href=&quot;#multi-token-prediction-mtp&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Dengan &lt;strong&gt;3 lightweight MTP modules&lt;/strong&gt; menggunakan dense FFN, kecepatan output meningkat hingga &lt;strong&gt;3x lipat&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Benchmark Performa&lt;a href=&quot;#benchmark-performa&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Artificial Analysis Intelligence Index&lt;a href=&quot;#artificial-analysis-intelligence-index&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Model&lt;/th&gt;&lt;th&gt;Intelligence Index&lt;/th&gt;&lt;th&gt;Biaya Run&lt;/th&gt;&lt;th&gt;Output Token&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;MiMo V2.5 Pro&lt;/td&gt;&lt;td&gt;54&lt;/td&gt;&lt;td&gt;$462&lt;/td&gt;&lt;td&gt;~92M&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Kimi K2.6&lt;/td&gt;&lt;td&gt;54&lt;/td&gt;&lt;td&gt;$948&lt;/td&gt;&lt;td&gt;~170M&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GLM-5.1&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;$544&lt;/td&gt;&lt;td&gt;~110M&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Kemampuan Agentic (GDPval-AA)&lt;a href=&quot;#kemampuan-agentic-gdpval-aa&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Peringkat&lt;/th&gt;&lt;th&gt;Model&lt;/th&gt;&lt;th&gt;Skor GDPval-AA&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;MiMo V2.5 Pro&lt;/td&gt;&lt;td&gt;1578&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;DeepSeek V4 Pro&lt;/td&gt;&lt;td&gt;1554&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;GLM-5.1&lt;/td&gt;&lt;td&gt;1535&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;MiniMax-M2.7&lt;/td&gt;&lt;td&gt;1514&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;Kimi K2.6&lt;/td&gt;&lt;td&gt;1484&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Benchmark Base Model&lt;a href=&quot;#benchmark-base-model&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;





















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Kategori&lt;/th&gt;&lt;th&gt;Benchmark&lt;/th&gt;&lt;th&gt;MiMo V2.5 Pro&lt;/th&gt;&lt;th&gt;MiMo V2.5&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;General&lt;/td&gt;&lt;td&gt;BBH (3-shot)&lt;/td&gt;&lt;td&gt;88.4&lt;/td&gt;&lt;td&gt;87.2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;General&lt;/td&gt;&lt;td&gt;MMLU (5-shot)&lt;/td&gt;&lt;td&gt;89.4&lt;/td&gt;&lt;td&gt;86.3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Math&lt;/td&gt;&lt;td&gt;GSM8K (8-shot)&lt;/td&gt;&lt;td&gt;99.6&lt;/td&gt;&lt;td&gt;83.3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Math&lt;/td&gt;&lt;td&gt;MATH (4-shot)&lt;/td&gt;&lt;td&gt;86.2&lt;/td&gt;&lt;td&gt;67.7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Code&lt;/td&gt;&lt;td&gt;HumanEval+ (1-shot)&lt;/td&gt;&lt;td&gt;75.6&lt;/td&gt;&lt;td&gt;71.3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Code&lt;/td&gt;&lt;td&gt;LiveCodeBench v6&lt;/td&gt;&lt;td&gt;39.6&lt;/td&gt;&lt;td&gt;35.5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Chinese&lt;/td&gt;&lt;td&gt;C-Eval (5-shot)&lt;/td&gt;&lt;td&gt;91.5&lt;/td&gt;&lt;td&gt;88.6&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;Kemampuan Agentic: Bukan Sekadar Chatbot&lt;a href=&quot;#kemampuan-agentic-bukan-sekadar-chatbot&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Studi Kasus: Compiler SysY dalam Rust&lt;a href=&quot;#studi-kasus-compiler-sysy-dalam-rust&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Waktu pengerjaan mahasiswa&lt;/strong&gt;: Beberapa minggu&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Waktu MiMo V2.5 Pro&lt;/strong&gt;: 4.3 jam, 672 tool calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hasil&lt;/strong&gt;: Skor sempurna &lt;strong&gt;233/233&lt;/strong&gt; pada hidden test suite&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Studi Kasus: Video Editor Desktop&lt;a href=&quot;#studi-kasus-video-editor-desktop&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Total kode&lt;/strong&gt;: 8.192 baris&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool calls&lt;/strong&gt;: 1.868&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Waktu&lt;/strong&gt;: 11.5 jam kerja autonom&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Perbandingan dengan Model Lain&lt;a href=&quot;#perbandingan-dengan-model-lain&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;




































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspek&lt;/th&gt;&lt;th&gt;MiMo V2.5 Pro&lt;/th&gt;&lt;th&gt;Claude Opus 4.6&lt;/th&gt;&lt;th&gt;DeepSeek V4 Pro&lt;/th&gt;&lt;th&gt;GPT-5.2&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Total Parameter&lt;/td&gt;&lt;td&gt;1.02T&lt;/td&gt;&lt;td&gt;Proprietary&lt;/td&gt;&lt;td&gt;1.6T&lt;/td&gt;&lt;td&gt;Proprietary&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Active Parameter&lt;/td&gt;&lt;td&gt;42B&lt;/td&gt;&lt;td&gt;Proprietary&lt;/td&gt;&lt;td&gt;49B&lt;/td&gt;&lt;td&gt;Proprietary&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Context Window&lt;/td&gt;&lt;td&gt;1M token&lt;/td&gt;&lt;td&gt;200K&lt;/td&gt;&lt;td&gt;128K&lt;/td&gt;&lt;td&gt;128K&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GDPval-AA&lt;/td&gt;&lt;td&gt;1578&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;1554&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ClawEval&lt;/td&gt;&lt;td&gt;61.5&lt;/td&gt;&lt;td&gt;66.3&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;50.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PinchBench&lt;/td&gt;&lt;td&gt;81.0&lt;/td&gt;&lt;td&gt;81.5&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;77.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Harga/1M token&lt;/td&gt;&lt;td&gt;&lt;span&gt;&lt;span&gt;1/1 / &lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;3&lt;/td&gt;&lt;td&gt;&lt;span&gt;&lt;span&gt;15/15 / &lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;15/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;75&lt;/td&gt;&lt;td&gt;&lt;span&gt;&lt;span&gt;0.27/0.27 / &lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.27/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;1.10&lt;/td&gt;&lt;td&gt;&lt;span&gt;&lt;span&gt;2/2 / &lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;2/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Lisensi&lt;/td&gt;&lt;td&gt;MIT (open)&lt;/td&gt;&lt;td&gt;Proprietary&lt;/td&gt;&lt;td&gt;MIT (open)&lt;/td&gt;&lt;td&gt;Proprietary&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;Long Context: Performa di 1 Juta Token&lt;a href=&quot;#long-context-performa-di-1-juta-token&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Panjang Konteks&lt;/th&gt;&lt;th&gt;MiMo V2.5 Pro (BFS)&lt;/th&gt;&lt;th&gt;MiMo V2.5 Pro (Parents)&lt;/th&gt;&lt;th&gt;MiMo V2 Pro (BFS)&lt;/th&gt;&lt;th&gt;MiMo V2 Pro (Parents)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;32K&lt;/td&gt;&lt;td&gt;Tinggi&lt;/td&gt;&lt;td&gt;Tinggi&lt;/td&gt;&lt;td&gt;Tinggi&lt;/td&gt;&lt;td&gt;Tinggi&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;128K&lt;/td&gt;&lt;td&gt;Tinggi&lt;/td&gt;&lt;td&gt;Tinggi&lt;/td&gt;&lt;td&gt;Mulai turun&lt;/td&gt;&lt;td&gt;Mulai turun&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;512K&lt;/td&gt;&lt;td&gt;0.56&lt;/td&gt;&lt;td&gt;0.92&lt;/td&gt;&lt;td&gt;0.00&lt;/td&gt;&lt;td&gt;0.00&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1M&lt;/td&gt;&lt;td&gt;0.37&lt;/td&gt;&lt;td&gt;0.62&lt;/td&gt;&lt;td&gt;0.00&lt;/td&gt;&lt;td&gt;0.00&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;Model Keluarga MiMo V2.5&lt;a href=&quot;#model-keluarga-mimo-v25&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Model&lt;/th&gt;&lt;th&gt;Tanggal Rilis&lt;/th&gt;&lt;th&gt;Keunggulan Utama&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;MiMo V2.5 Pro&lt;/td&gt;&lt;td&gt;22 April 2026&lt;/td&gt;&lt;td&gt;Flagship, agentic terkuat, 1T params&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MiMo V2.5&lt;/td&gt;&lt;td&gt;23 April 2026&lt;/td&gt;&lt;td&gt;Multimodal native, 310B params&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MiMo V2.5 TTS&lt;/td&gt;&lt;td&gt;23 April 2026&lt;/td&gt;&lt;td&gt;Text-to-speech, voice cloning&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MiMo V2.5 ASR&lt;/td&gt;&lt;td&gt;2 Juni 2026&lt;/td&gt;&lt;td&gt;Speech recognition, dialek Tiongkok&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;Cara Menggunakan&lt;a href=&quot;#cara-menggunakan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Via API&lt;a href=&quot;#via-api&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; openai &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; OpenAI&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;client &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; OpenAI(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    api_key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;your-api-key&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    base_url&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;https://api.mimo.xiaomi.com/v1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;response &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; client.chat.completions.create(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    model&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;mimo-v2.5-pro&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    messages&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        {&lt;/span&gt;&lt;span&gt;&quot;role&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;user&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;content&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;Jelaskan arsitektur Mixture-of-Experts&quot;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    max_tokens&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;2048&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(response.choices[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;].message.content)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Self-Hosting Requirements&lt;/strong&gt;&lt;a href=&quot;#self-hosting-requirements&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;Kebutuhan&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;Minimum&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;Direkomendasikan&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;GPU&lt;/td&gt;&lt;td&gt;4x A100 80GB&lt;/td&gt;&lt;td&gt;8x H100 80GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RAM&lt;/td&gt;&lt;td&gt;128GB&lt;/td&gt;&lt;td&gt;256GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Storage&lt;/td&gt;&lt;td&gt;2TB NVMe&lt;/td&gt;&lt;td&gt;4TB NVMe&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Framework&lt;/td&gt;&lt;td&gt;vLLM / SGLang&lt;/td&gt;&lt;td&gt;vLLM dengan MTP support&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Ekosistem dan Integrasi&lt;/strong&gt;&lt;a href=&quot;#ekosistem-dan-integrasi&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;Framework&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;Tipe&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;OpenClaw&lt;/td&gt;&lt;td&gt;General-purpose agent&lt;/td&gt;&lt;td&gt;Partner resmi&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenCode&lt;/td&gt;&lt;td&gt;Coding agent&lt;/td&gt;&lt;td&gt;Partner resmi&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;KiloCode&lt;/td&gt;&lt;td&gt;Coding agent&lt;/td&gt;&lt;td&gt;Partner resmi&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Claude Code&lt;/td&gt;&lt;td&gt;Coding harness&lt;/td&gt;&lt;td&gt;Didukung resmi&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Blackbox&lt;/td&gt;&lt;td&gt;AI coding&lt;/td&gt;&lt;td&gt;Partner resmi&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cline&lt;/td&gt;&lt;td&gt;VS Code agent&lt;/td&gt;&lt;td&gt;Partner resmi&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Kesimpulan&lt;/strong&gt;&lt;a href=&quot;#kesimpulan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;MiMo V2.5 Pro menandai era baru di mana perusahaan seperti Xiaomi mampu membangun AI yang bersaing di level tertinggi. Dengan &lt;strong&gt;performa agentic #1&lt;/strong&gt;, &lt;strong&gt;biaya 25x lebih murah&lt;/strong&gt; dari Claude Opus 4.6, &lt;strong&gt;context window 1M token&lt;/strong&gt;, dan &lt;strong&gt;lisensi MIT&lt;/strong&gt; — frontier AI kini lebih terjangkau dari sebelumnya.&lt;/p&gt;
&lt;p&gt;Bagi developer Indonesia, dengan $3 per juta output token, Anda sudah bisa memanfaatkan kecerdasan sekelas model terbaik dunia.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Artikel ini ditulis berdasarkan data benchmark dari Artificial Analysis dan dokumentasi resmi Xiaomi MiMo, April-Juni 2026.&lt;/em&gt;&lt;/p&gt;</content:encoded><category>category:ai</category><category>tag:xiaomi</category><category>tag:mimo</category><category>tag:ai</category><category>tag:llm</category></item><item><title>test table</title><link>https://webku-7lt.pages.dev/ja/post/test-table</link><guid isPermaLink="false">ja:test-table</guid><description>



















Kolom 1Kolom 2Kolom 3Data 1Data 2Data 3Data 4Data 5Data 6</description><pubDate>Mon, 15 Jun 2026 22:15:00 GMT</pubDate><content:encoded>



















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Kolom 1&lt;/th&gt;&lt;th&gt;Kolom 2&lt;/th&gt;&lt;th&gt;Kolom 3&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Data 1&lt;/td&gt;&lt;td&gt;Data 2&lt;/td&gt;&lt;td&gt;Data 3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Data 4&lt;/td&gt;&lt;td&gt;Data 5&lt;/td&gt;&lt;td&gt;Data 6&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</content:encoded></item><item><title>Setup Home Server Lengkap dengan Armbian + Docker Compose</title><link>https://webku-7lt.pages.dev/ja/post/setup-home-server-lengkap-dengan-armbian-docker-compose</link><guid isPermaLink="false">ja:setup-home-server-lengkap-dengan-armbian-docker-compose</guid><description>Panduan membangun home server all-in-one dengan Armbian menggunakan Docker Compose. Install Pi-hole, Jellyfin, dan File Browser dalam satu board ARM.</description><pubDate>Mon, 15 Jun 2026 22:01:00 GMT</pubDate><content:encoded/><category>category:armbian</category><category>tag:armbian</category></item><item><title>Armbian Server di TV Box Amlogic — Ubah Android TV Box Jadi Linux Server Murah</title><link>https://webku-7lt.pages.dev/ja/post/armbian-server-di-tv-box-amlogic</link><guid isPermaLink="false">ja:armbian-server-di-tv-box-amlogic</guid><description>Panduan lengkap mengubah TV Box Amlogic (S905X, S905W, S912) menjadi server Linux dengan Armbian. Mulai dari flashing, boot, hingga optimasi untuk NAS, Docker, dan home server.</description><pubDate>Mon, 15 Jun 2026 21:26:00 GMT</pubDate><content:encoded>&lt;h1&gt;Armbian Server di TV Box Amlogic — Ubah Android TV Box Jadi Linux Server Murah&lt;a href=&quot;#armbian-server-di-tv-box-amlogic--ubah-android-tv-box-jadi-linux-server-murah&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;Pendahuluan&lt;a href=&quot;#pendahuluan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;TV Box berchipset &lt;strong&gt;Amlogic&lt;/strong&gt; (S905X, S905W, S905X2, S912, S922X) yang beredar di pasaran dengan harga &lt;strong&gt;Rp 150 ribu - 400 ribu&lt;/strong&gt; ternyata bisa diubah menjadi &lt;strong&gt;Linux server&lt;/strong&gt; yang sangat capable dengan &lt;strong&gt;Armbian&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Dibanding membeli Raspberry Pi yang harganya naik drastis, TV Box Amlogic menawarkan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RAM 2-4GB&lt;/strong&gt; dengan harga sangat terjangkau&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage internal eMMC&lt;/strong&gt; yang lebih cepat dari SD Card&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Port Ethernet&lt;/strong&gt; 100Mbps atau Gigabit&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;USB 2.0/3.0&lt;/strong&gt; untuk hard disk eksternal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HDMI&lt;/strong&gt; untuk troubleshooting langsung&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Artikel ini akan membahas cara mengubah TV Box Amlogic Anda menjadi server Linux produktif dengan Armbian.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;TV Box Amlogic yang Kompatibel&lt;a href=&quot;#tv-box-amlogic-yang-kompatibel&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Chipset yang Didukung Armbian&lt;a href=&quot;#chipset-yang-didukung-armbian&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;S905X&lt;/strong&gt; — MXQ Pro 4K, T95X, X96 — RAM 1-2GB, cocok untuk server ringan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S905W&lt;/strong&gt; — X96 Mini, T95 Mini — Versi low-power S905X, hemat listrik&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S905X2&lt;/strong&gt; — X96 Max, HK1 Box — Lebih cepat, USB 3.0, RAM 2-4GB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S912&lt;/strong&gt; — T95Z Plus, TX9 Pro — Octa-core, cocok untuk media server&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S922X&lt;/strong&gt; — Ugoos AM6, Odroid N2+ — Performa tinggi, harga lebih mahal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S905X3&lt;/strong&gt; — X96 Air, HK1 X3 — Support mainline kernel modern&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cek Chipset TV Box Anda&lt;a href=&quot;#cek-chipset-tv-box-anda&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Sebelum mulai, pastikan chipset TV Box Anda:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Lihat stiker di bawah unit&lt;/strong&gt; — biasanya tertulis S905X, S912, dll&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cek dengan AIDA64&lt;/strong&gt; — install dari Play Store, lihat bagian CPU&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cek di forum Armbian&lt;/strong&gt; — cari model TV Box Anda di &lt;a href=&quot;https://forum.armbian.com&quot;&gt;forum.armbian.com&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;gt; &lt;strong&gt;Peringatan&lt;/strong&gt;: Tidak semua TV Box Amlogic bisa boot Armbian. Beberapa memiliki &lt;strong&gt;bootloader terkunci&lt;/strong&gt; atau &lt;strong&gt;WiFi/BT chip yang tidak ada driver Linux&lt;/strong&gt;. Ethernet biasanya selalu berfungsi.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Alat dan Bahan&lt;a href=&quot;#alat-dan-bahan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TV Box Amlogic&lt;/strong&gt; — Pastikan chipset didukung&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MicroSD Card&lt;/strong&gt; — 16GB atau lebih (Class 10/UHS-I)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Card Reader&lt;/strong&gt; — USB Card Reader&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kabel Ethernet&lt;/strong&gt; — Untuk koneksi network&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mouse &amp;amp; Keyboard&lt;/strong&gt; — Untuk konfigurasi awal (opsional)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HDMI Monitor&lt;/strong&gt; — Untuk melihat proses boot pertama&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Toothpick / Jarum&lt;/strong&gt; — Untuk masuk ke recovery/boot mode&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Langkah 1: Download Armbian untuk Amlogic&lt;a href=&quot;#langkah-1-download-armbian-untuk-amlogic&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Pilih Image yang Tepat&lt;a href=&quot;#pilih-image-yang-tepat&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Kunjungi halaman Armbian untuk Amlogic:&lt;br /&gt;
&lt;a href=&quot;https://github.com/ophub/amlogic-s9xxx-armbian&quot;&gt;github.com/ophub/amlogic-s9xxx-armbian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pilih image sesuai chipset Anda:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Armbian_xxx_Aml_s905x_bullseye_xxx.img.gz&lt;/code&gt; → untuk S905X&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Armbian_xxx_Aml_s912_bullseye_xxx.img.gz&lt;/code&gt; → untuk S912&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Armbian_xxx_Aml_s905x2_bullseye_xxx.img.gz&lt;/code&gt; → untuk S905X2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pilih versi Server (CLI)&lt;/strong&gt; jika tujuannya pure server.&lt;br /&gt;
Pilih versi Desktop jika butuh GUI sesekali.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;gt; &lt;strong&gt;Tips&lt;/strong&gt;: Versi &lt;strong&gt;Bullseye&lt;/strong&gt; (Debian 11) atau &lt;strong&gt;Bookworm&lt;/strong&gt; (Debian 12) lebih stabil untuk server. Versi &lt;strong&gt;Jammy&lt;/strong&gt; (Ubuntu 22.04) jika butuh package lebih baru.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Langkah 2: Flash Image ke MicroSD&lt;a href=&quot;#langkah-2-flash-image-ke-microsd&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Menggunakan BalenaEtcher&lt;a href=&quot;#menggunakan-balenaetcher&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Buka BalenaEtcher&lt;/li&gt;
&lt;li&gt;Pilih file &lt;code&gt;.img&lt;/code&gt; atau &lt;code&gt;.img.gz&lt;/code&gt; Armbian&lt;/li&gt;
&lt;li&gt;Pilih MicroSD Card&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Flash&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Menggunakan &lt;code&gt;dd&lt;/code&gt; (Linux)&lt;a href=&quot;#menggunakan-dd-linux&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# Cek device SD card&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;lsblk&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Flash (GANTI sdX dengan device Anda!)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; dd&lt;/span&gt;&lt;span&gt; if=Armbian_xxx.img&lt;/span&gt;&lt;span&gt; of=/dev/sdX&lt;/span&gt;&lt;span&gt; bs=4M&lt;/span&gt;&lt;span&gt; status=progress&lt;/span&gt;&lt;span&gt; conv=fsyn&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan&lt;/strong&gt;: Jika TV Box tetap boot ke Android, kemungkinan bootloader tidak mendukung SD boot. Solusi: &lt;strong&gt;flash Armbian ke internal eMMC&lt;/strong&gt; (dibahas di bagian lanjutan).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Langkah 4: Boot Pertama &amp;amp; Konfigurasi&lt;/strong&gt;&lt;a href=&quot;#langkah-4-boot-pertama--konfigurasi&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;Proses Boot&lt;/strong&gt;&lt;a href=&quot;#proses-boot&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;TV Box akan boot dari MicroSD&lt;/li&gt;
&lt;li&gt;Tampilan awal akan resize filesystem (tunggu 1-2 menit)&lt;/li&gt;
&lt;li&gt;Login prompt muncul&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;strong&gt;Login Default&lt;/strong&gt;&lt;a href=&quot;#login-default&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;













&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Username&lt;/th&gt;&lt;th&gt;Password&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;root&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;1234&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;&lt;strong&gt;First Boot Wizard&lt;/strong&gt;&lt;a href=&quot;#first-boot-wizard&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Setelah login, wizard akan meminta:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ubah password root&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Buat user baru&lt;/strong&gt; (wajib, root login via SSH akan disabled)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pilih timezone&lt;/strong&gt; → &lt;code&gt;Asia/Jakarta&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pilih locale&lt;/strong&gt; → &lt;code&gt;en_US.UTF-8&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pilih shell&lt;/strong&gt; → &lt;code&gt;bash&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Langkah 5: Install Armbian ke Internal eMMC (Opsional tapi Direkomendasikan)&lt;/strong&gt;&lt;a href=&quot;#langkah-5-install-armbian-ke-internal-emmc-opsional-tapi-direkomendasikan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Boot dari MicroSD lebih lambat dan tidak stabil untuk long-term. Sebaiknya install Armbian ke &lt;strong&gt;internal eMMC&lt;/strong&gt; TV Box.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Cek eMMC Terdeteksi&lt;/strong&gt;&lt;a href=&quot;#cek-emmc-terdeteksi&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;lsblk&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Cari device seperti /dev/mmcblk1 atau /dev/mmcblk2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Install ke eMMC dengan &lt;code&gt;armbian-install&lt;/code&gt;&lt;/strong&gt;&lt;a href=&quot;#install-ke-emmc-dengan-armbian-install&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# Jalankan script install&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; armbian-install&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Atau jika tidak tersedia:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; nand-sata-install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pilihan yang muncul:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Boot from eMMC&lt;/strong&gt; → install sistem ke eMMC&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Boot from SD / system on eMMC&lt;/strong&gt; → boot dari SD tapi rootfs di eMMC&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Boot from eMMC / system on SATA/NVMe&lt;/strong&gt; → untuk USB/SATA&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pilih &lt;strong&gt;opsi 1&lt;/strong&gt; untuk install penuh ke eMMC.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Peringatan&lt;/strong&gt;: Proses ini akan &lt;strong&gt;menghapus Android&lt;/strong&gt; di TV Box Anda. Pastikan sudah yakin!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Setelah selesai:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; poweroff&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cabut MicroSD, lalu nyalakan TV Box. Sekarang Armbian akan boot langsung dari eMMC yang jauh lebih cepat.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Langkah 6: Optimasi untuk Server&lt;/strong&gt;&lt;a href=&quot;#langkah-6-optimasi-untuk-server&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;1. Disable GUI (Jika Install Versi Desktop)&lt;/strong&gt;&lt;a href=&quot;#1-disable-gui-jika-install-versi-desktop&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Jika Anda install versi desktop tapi ingin pure server:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# Disable display manager&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; disable&lt;/span&gt;&lt;span&gt; lightdm&lt;/span&gt;&lt;span&gt; gdm3&lt;/span&gt;&lt;span&gt; sddm&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Set multi-user target (CLI only)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; set-default&lt;/span&gt;&lt;span&gt; multi-user.target&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Reboot&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; reboot&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;2. Optimasi CPU Governor&lt;/strong&gt;&lt;a href=&quot;#2-optimasi-cpu-governor&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; nano&lt;/span&gt;&lt;span&gt; /etc/default/cpufrequtils&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Isi:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;ENABLE&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;GOVERNOR&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;ondemand&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;MIN_SPEED&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;100000&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;MAX_SPEED&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1900000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Restart:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; restart&lt;/span&gt;&lt;span&gt; cpufrequtils&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;3. Disable Bluetooth &amp;amp; WiFi (Jika Tidak Digunakan)&lt;/strong&gt;&lt;a href=&quot;#3-disable-bluetooth--wifi-jika-tidak-digunakan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Hemat RAM dan CPU:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; disable&lt;/span&gt;&lt;span&gt; bluetooth&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; disable&lt;/span&gt;&lt;span&gt; bluetooth.service&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; disable&lt;/span&gt;&lt;span&gt; NetworkManager-wait-online.service&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Blacklist driver WiFi (jika WiFi tidak stabil di Linux)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;blacklist dhd&quot;&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; sudo&lt;/span&gt;&lt;span&gt; tee&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; /etc/modprobe.d/blacklist.conf&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;blacklist cfg80211&quot;&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; sudo&lt;/span&gt;&lt;span&gt; tee&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; /etc/modprobe.d/blacklist.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;4. Setup Static IP&lt;/strong&gt;&lt;a href=&quot;#4-setup-static-ip&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; nano&lt;/span&gt;&lt;span&gt; /etc/network/interfaces&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Isi:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;auto&lt;/span&gt;&lt;span&gt; eth0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;iface&lt;/span&gt;&lt;span&gt; eth0&lt;/span&gt;&lt;span&gt; inet&lt;/span&gt;&lt;span&gt; static&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    address&lt;/span&gt;&lt;span&gt; 192.168.1.100&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    netmask&lt;/span&gt;&lt;span&gt; 255.255.255.0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    gateway&lt;/span&gt;&lt;span&gt; 192.168.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    dns-nameservers&lt;/span&gt;&lt;span&gt; 1.1.1.1&lt;/span&gt;&lt;span&gt; 8.8.8.8&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Restart network:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; restart&lt;/span&gt;&lt;span&gt; networking&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;5. Thermal Management&lt;/strong&gt;&lt;a href=&quot;#5-thermal-management&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;TV Box Amlogic cenderung panas. Pastikan cooling cukup:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# Cek suhu CPU&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; /sys/class/thermal/thermal_zone0/temp&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Output: 45000 = 45°C&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Install fan control (jika ada fan)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; apt&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; lm-sensors&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Langkah 7: Install Docker &amp;amp; Deploy Aplikasi Server&lt;/strong&gt;&lt;a href=&quot;#langkah-7-install-docker--deploy-aplikasi-server&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Setelah Armbian berjalan optimal, install Docker untuk menjalankan berbagai service:&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Install Docker&lt;/strong&gt;&lt;a href=&quot;#install-docker&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -fsSL&lt;/span&gt;&lt;span&gt; https://get.docker.com&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; sh&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; usermod&lt;/span&gt;&lt;span&gt; -aG&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;span&gt; $USER&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;newgrp&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Install Docker Compose&lt;/strong&gt;&lt;a href=&quot;#install-docker-compose&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; apt&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; docker-compose-plugin&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Project 1: File Browser (NAS Ringan)&lt;/strong&gt;&lt;a href=&quot;#project-1-file-browser-nas-ringan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;yaml&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# docker-compose.yml&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;3&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  filebrowser&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;filebrowser/filebrowser:s6&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;filebrowser&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;8080:80&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/:/srv&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./filebrowser.db:/database.db&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Project 2: Pi-hole&lt;/strong&gt;&lt;a href=&quot;#project-2-pi-hole&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;yaml&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;3&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  pihole&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;pihole/pihole:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;pihole&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;53:53/tcp&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;53:53/udp&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;8081:80/tcp&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      TZ&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;Asia/Jakarta&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      WEBPASSWORD&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;admin123&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&apos;./etc-pihole:/etc/pihole&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&apos;./etc-dnsmasq.d:/etc/dnsmasq.d&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Project 3: Uptime Kuma (Monitoring)&lt;/strong&gt;&lt;a href=&quot;#project-3-uptime-kuma-monitoring&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;yaml&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;3&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  uptime-kuma&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;louislam/uptime-kuma:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;uptime-kuma&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;3001:3001&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./uptime-kuma-data:/app/data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Troubleshooting Khusus Amlogic&lt;/strong&gt;&lt;a href=&quot;#troubleshooting-khusus-amlogic&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;TV Box Boot Loop ke Android&lt;/strong&gt;&lt;a href=&quot;#tv-box-boot-loop-ke-android&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Solusi&lt;/strong&gt;: Bootloader Android masih aktif. Gunakan &lt;strong&gt;Amlogic USB Burning Tool&lt;/strong&gt; untuk flash custom bootloader, atau gunakan &lt;strong&gt;Multitool&lt;/strong&gt; dari balena150.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Ethernet Tidak Terdeteksi&lt;/strong&gt;&lt;a href=&quot;#ethernet-tidak-terdeteksi&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Solusi&lt;/strong&gt;: Beberapa TV Box menggunakan chip Ethernet yang tidak umum. Cek dengan:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;dmesg&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; grep&lt;/span&gt;&lt;span&gt; -i&lt;/span&gt;&lt;span&gt; eth&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;lspci&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;lsusb&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jika tidak terdeteksi, cari driver spesifik di forum Armbian atau gunakan &lt;strong&gt;USB Ethernet Adapter&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;HDMI Tidak Keluar Output&lt;/strong&gt;&lt;a href=&quot;#hdmi-tidak-keluar-output&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Solusi&lt;/strong&gt;: Beberapa TV Box membutuhkan &lt;strong&gt;DTB (Device Tree Blob) yang tepat&lt;/strong&gt;. Ganti file &lt;code&gt;.dtb&lt;/code&gt; di &lt;code&gt;/boot/dtb/amlogic/&lt;/code&gt; dengan yang sesuai model TV Box Anda.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Panas Berlebihan &amp;amp; Thermal Throttling&lt;/strong&gt;&lt;a href=&quot;#panas-berlebihan--thermal-throttling&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Solusi&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tambahkan &lt;strong&gt;heatsink&lt;/strong&gt; pada chip Amlogic&lt;/li&gt;
&lt;li&gt;Pasang &lt;strong&gt;fan kecil 5V&lt;/strong&gt; di dalam casing&lt;/li&gt;
&lt;li&gt;Turunkan &lt;code&gt;MAX_SPEED&lt;/code&gt; di cpufrequtils&lt;/li&gt;
&lt;li&gt;Pastikan casing TV Box tidak tertutup rapat&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;WiFi Tidak Berfungsi&lt;/strong&gt;&lt;a href=&quot;#wifi-tidak-berfungsi&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Solusi&lt;/strong&gt;: WiFi di TV Box Amlogic sangat sering &lt;strong&gt;tidak ada driver Linux&lt;/strong&gt;. Solusi terbaik adalah menggunakan &lt;strong&gt;kabel Ethernet&lt;/strong&gt; atau &lt;strong&gt;USB WiFi Adapter&lt;/strong&gt; yang support Linux (Realtek RTL8812AU, MT7601U).&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Perbandingan TV Box Amlogic vs Raspberry Pi&lt;/strong&gt;&lt;a href=&quot;#perbandingan-tv-box-amlogic-vs-raspberry-pi&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;


















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Spesifikasi&lt;/th&gt;&lt;th&gt;TV Box Amlogic S905X2&lt;/th&gt;&lt;th&gt;Raspberry Pi 4 2GB&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Harga&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Rp 250-350 ribu&lt;/td&gt;&lt;td&gt;Rp 600-800 ribu&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CPU&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Quad-core Cortex-A53&lt;/td&gt;&lt;td&gt;Quad-core Cortex-A72&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;RAM&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;2-4GB DDR3/4&lt;/td&gt;&lt;td&gt;2-8GB LPDDR4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;eMMC 8-16GB + MicroSD&lt;/td&gt;&lt;td&gt;MicroSD only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Ethernet&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;100M / Gigabit&lt;/td&gt;&lt;td&gt;Gigabit&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;USB&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;USB 2.0 / 3.0&lt;/td&gt;&lt;td&gt;USB 2.0 + 3.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GPIO&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Tidak ada&lt;/td&gt;&lt;td&gt;40-pin GPIO&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Komunitas&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Aktif (China/Internasional)&lt;/td&gt;&lt;td&gt;Sangat besar&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Kesimpulan&lt;/strong&gt;: Jika Anda butuh &lt;strong&gt;server headless tanpa GPIO&lt;/strong&gt;, TV Box Amlogic adalah pilihan &lt;strong&gt;jauh lebih hemat biaya&lt;/strong&gt;. Raspberry Pi unggul jika butuh GPIO, kamera, atau HAT.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Kesimpulan&lt;/strong&gt;&lt;a href=&quot;#kesimpulan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;TV Box Amlogic yang terbengkalai bisa dihidupkan kembali sebagai &lt;strong&gt;Linux server&lt;/strong&gt; yang powerful dengan Armbian. Dengan biaya di bawah Rp 400 ribu, Anda mendapatkan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Server Linux 24/7 dengan konsumsi daya &lt;strong&gt;5-10 watt&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Storage internal eMMC yang lebih cepat dari SD Card&lt;/li&gt;
&lt;li&gt;Kemampuan menjalankan &lt;strong&gt;Docker, NAS, Pi-hole, Home Assistant&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Upgrade path ke &lt;strong&gt;eMMC&lt;/strong&gt; untuk performa lebih baik&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Meskipun ada keterbatasan seperti &lt;strong&gt;tidak adanya GPIO&lt;/strong&gt; dan &lt;strong&gt;WiFi yang sering tidak support&lt;/strong&gt;, untuk use case &lt;strong&gt;server jaringan dan home automation&lt;/strong&gt;, TV Box Amlogic + Armbian adalah kombinasi yang sangat &lt;strong&gt;worth it&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Siap mengubah TV Box tua Anda menjadi server produktif?&lt;/strong&gt; &lt;/p&gt;</content:encoded><category>category:armbian</category><category>tag:armbian</category></item><item><title>Cara Install Docker di Armbian untuk Pemula — Lengkap dengan Contoh Project</title><link>https://webku-7lt.pages.dev/ja/post/cara-install-docker-di-armbian-untuk-pemula-lengkap-dengan-contoh-project</link><guid isPermaLink="false">ja:cara-install-docker-di-armbian-untuk-pemula-lengkap-dengan-contoh-project</guid><description>Panduan step-by-step install Docker dan Docker Compose di Armbian. Dari setup repository hingga menjalankan container pertama untuk Home Assistant, Pi-hole, dan Nginx.</description><pubDate>Mon, 15 Jun 2026 21:02:00 GMT</pubDate><content:encoded>&lt;h1&gt;Cara Install Docker di Armbian untuk Pemula — Lengkap dengan Contoh Project&lt;a href=&quot;#cara-install-docker-di-armbian-untuk-pemula--lengkap-dengan-contoh-project&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;Kenapa Docker di Armbian?&lt;a href=&quot;#kenapa-docker-di-armbian&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt; adalah platform containerization yang memungkinkan Anda menjalankan aplikasi dalam lingkungan terisolasi tanpa perlu menginstall dependency satu per satu di sistem utama.&lt;/p&gt;
&lt;p&gt;Keuntungan menggunakan Docker di board ARM dengan Armbian:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Isolasi aplikasi&lt;/strong&gt; — tiap app punya environment sendiri&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mudah backup&lt;/strong&gt; — cukup backup volume container&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Portability&lt;/strong&gt; — docker-compose.yml bisa dipindah ke board lain&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rollback mudah&lt;/strong&gt; — hapus container dan buat ulang jika error&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hemat resource&lt;/strong&gt; — lebih ringan dari VM&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Persiapan Sebelum Install&lt;a href=&quot;#persiapan-sebelum-install&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pastikan sistem Armbian Anda sudah:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ Update ke versi terbaru&lt;/li&gt;
&lt;li&gt;✅ Memiliki koneksi internet stabil&lt;/li&gt;
&lt;li&gt;✅ Minimal &lt;strong&gt;1GB RAM&lt;/strong&gt; (2GB lebih baik untuk multiple container)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cek versi Armbian Anda:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; /etc/os-releas&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pastikan Anda menggunakan Armbian berbasis &lt;strong&gt;Debian&lt;/strong&gt; atau &lt;strong&gt;Ubuntu&lt;/strong&gt; (Bookworm, Jammy, atau Bullseye).&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Langkah 1: Update Sistem&lt;/strong&gt;&lt;a href=&quot;#langkah-1-update-sistem&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; apt&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; apt&lt;/span&gt;&lt;span&gt; upgrade&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; apt&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; ca-certificates&lt;/span&gt;&lt;span&gt; curl&lt;/span&gt;&lt;span&gt; gnupg&lt;/span&gt;&lt;span&gt; lsb-release&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Langkah 2: Install Docker Official&lt;/strong&gt;&lt;a href=&quot;#langkah-2-install-docker-official&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;Tambahkan Docker GPG Key&lt;/strong&gt;&lt;a href=&quot;#tambahkan-docker-gpg-key&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; -m&lt;/span&gt;&lt;span&gt; 0755&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; /etc/apt/keyrings&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -fsSL&lt;/span&gt;&lt;span&gt; https://download.docker.com/linux/debian/gpg&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; sudo&lt;/span&gt;&lt;span&gt; gpg&lt;/span&gt;&lt;span&gt; --dearmor&lt;/span&gt;&lt;span&gt; -o&lt;/span&gt;&lt;span&gt; /etc/apt/keyrings/docker.gpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; chmod&lt;/span&gt;&lt;span&gt; a+r&lt;/span&gt;&lt;span&gt; /etc/apt/keyrings/docker.gpg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Tambahkan Docker Repository&lt;/strong&gt;&lt;a href=&quot;#tambahkan-docker-repository&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;deb [arch=&quot;&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;dpkg&lt;/span&gt;&lt;span&gt; --print-architecture&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&quot; signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; /etc/os-release&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;$VERSION_CODENAME&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&quot; stable&quot;&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  sudo&lt;/span&gt;&lt;span&gt; tee&lt;/span&gt;&lt;span&gt; /etc/apt/sources.list.d/docker.list&lt;/span&gt;&lt;span&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; /dev/null&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan&lt;/strong&gt;: Jika Anda menggunakan Ubuntu-based Armbian, ganti &lt;code&gt;debian&lt;/code&gt; menjadi &lt;code&gt;ubuntu&lt;/code&gt; pada URL di atas.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;&lt;strong&gt;Install Docker Engine&lt;/strong&gt;&lt;a href=&quot;#install-docker-engine&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; apt&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; apt&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; docker-ce&lt;/span&gt;&lt;span&gt; docker-ce-cli&lt;/span&gt;&lt;span&gt; containerd.io&lt;/span&gt;&lt;span&gt; docker-buildx-plugin&lt;/span&gt;&lt;span&gt; docker-compose-plugin&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Verifikasi Installasi&lt;/strong&gt;&lt;a href=&quot;#verifikasi-installasi&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;span&gt; --version&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;span&gt; compose&lt;/span&gt;&lt;span&gt; version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output yang diharapkan:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;plain&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Docker version 27.x.x, build xxxxx&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Docker Compose version v2.x.x&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Langkah 3: Jalankan Docker Tanpa Sudo (Opsional)&lt;/strong&gt;&lt;a href=&quot;#langkah-3-jalankan-docker-tanpa-sudo-opsional&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Secara default, Docker hanya bisa dijalankan dengan &lt;code&gt;sudo&lt;/code&gt;. Agar user biasa bisa menjalankan Docker:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# Tambahkan user ke grup docker&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; usermod&lt;/span&gt;&lt;span&gt; -aG&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;span&gt; $USER&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Apply perubahan (logout dan login ulang, atau reboot)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;newgrp&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Test:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; hello-world&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jika berhasil, Anda akan melihat pesan &lt;code&gt;Hello from Docker!&lt;/code&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Langkah 4: Install Docker Compose Standalone (Opsional)&lt;/strong&gt;&lt;a href=&quot;#langkah-4-install-docker-compose-standalone-opsional&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Meskipun Docker sudah menyertakan &lt;code&gt;docker compose&lt;/code&gt; (plugin), beberapa orang lebih nyaman dengan binary &lt;code&gt;docker-compose&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# Download versi terbaru untuk ARM64&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; curl&lt;/span&gt;&lt;span&gt; -L&lt;/span&gt;&lt;span&gt; &quot;https://github.com/docker/compose/releases/latest/download/docker-compose-linux-aarch64&quot;&lt;/span&gt;&lt;span&gt; -o&lt;/span&gt;&lt;span&gt; /usr/local/bin/docker-compose&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Beri permission execute&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; chmod&lt;/span&gt;&lt;span&gt; +x&lt;/span&gt;&lt;span&gt; /usr/local/bin/docker-compose&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Verifikasi&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker-compose&lt;/span&gt;&lt;span&gt; --version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Langkah 5: Project Pertama — Nginx Web Server&lt;/strong&gt;&lt;a href=&quot;#langkah-5-project-pertama--nginx-web-server&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Buat folder project dan jalankan container Nginx:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; ~/docker-projects&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; ~/docker-projects&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; nginx-test&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; nginx-test&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buat file &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;yaml&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;3.8&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nginx&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;nginx:alpine&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;nginx-web&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;8080:80&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./html:/usr/share/nginx/html&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buat folder &lt;code&gt;html&lt;/code&gt; dan file &lt;code&gt;index.html&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;mkdir html&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo &quot;&amp;lt;h1&amp;gt;Hello from Armbian + Docker!&amp;lt;/h1&amp;gt;&quot; &amp;gt; html/index.html&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jalankan container:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; compose&lt;/span&gt;&lt;span&gt; up&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buka browser dan akses: &lt;code&gt;http://IP-BOARD:8080&lt;/code&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Langkah 6: Project Kedua — Pi-hole dengan Docker&lt;/strong&gt;&lt;a href=&quot;#langkah-6-project-kedua--pi-hole-dengan-docker&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; ~/docker-projects&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; pihole&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; pihole&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;File &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;yaml&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;3.8&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  pihole&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;pihole/pihole:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;pihole&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;53:53/tcp&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;53:53/udp&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;8081:80/tcp&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      TZ&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;Asia/Jakarta&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      WEBPASSWORD&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;passwordadmin&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&apos;./etc-pihole:/etc/pihole&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&apos;./etc-dnsmasq.d:/etc/dnsmasq.d&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jalankan:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; compose&lt;/span&gt;&lt;span&gt; up&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Akses dashboard: &lt;code&gt;http://IP-BOARD:8081/admin&lt;/code&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Langkah 7: Project Ketiga — Home Assistant&lt;/strong&gt;&lt;a href=&quot;#langkah-7-project-ketiga--home-assistant&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; ~/docker-projects&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; homeassistant&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; homeassistant&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;File &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;yaml&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;3.8&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  homeassistant&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ghcr.io/home-assistant/home-assistant:stable&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;homeassistant&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    privileged&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;TZ=Asia/Jakarta&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./config:/config&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    network_mode&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jalankan:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;docker compose up -d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Akses UI: &lt;code&gt;http://IP-BOARD:8123&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Perintah Docker yang Sering Digunakan&lt;/strong&gt;&lt;/p&gt;





















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Perintah&lt;/th&gt;&lt;th&gt;Fungsi&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Lihat container yang berjalan&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;docker ps -a&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Lihat semua container (aktif &amp;amp; mati)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;docker logs CONTAINER&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Lihat log container&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;docker stop CONTAINER&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hentikan container&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;docker start CONTAINER&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Jalankan container&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;docker rm CONTAINER&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hapus container&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;docker images&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Lihat image yang tersedia&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;docker compose down&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hentikan dan hapus container + network&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;docker compose pull&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Download image terbaru&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Jalankan container di background&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;docker exec -it CONTAINER bash&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Masuk ke shell container&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;&lt;strong&gt;Troubleshooting&lt;/strong&gt;&lt;a href=&quot;#troubleshooting&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;Docker Service Tidak Berjalan&lt;/strong&gt;&lt;a href=&quot;#docker-service-tidak-berjalan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; start&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; enable&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Permission Denied&lt;/strong&gt;&lt;a href=&quot;#permission-denied&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pastikan user sudah ditambahkan ke grup &lt;code&gt;docker&lt;/code&gt; dan sudah logout-login ulang.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Container Exit Terus&lt;/strong&gt;&lt;a href=&quot;#container-exit-terus&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Cek log container untuk error:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; logs&lt;/span&gt;&lt;span&gt; --tail&lt;/span&gt;&lt;span&gt; 50&lt;/span&gt;&lt;span&gt; CONTAINER_NAME&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;Port Sudah Digunakan&lt;/strong&gt;&lt;a href=&quot;#port-sudah-digunakan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Cek port yang aktif:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; ss&lt;/span&gt;&lt;span&gt; -tlnp&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; grep&lt;/span&gt;&lt;span&gt; :PORT&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ubah port mapping di &lt;code&gt;docker-compose.yml&lt;/code&gt; jika bentrok.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Tips Optimasi Docker di Board ARM&lt;/strong&gt;&lt;a href=&quot;#tips-optimasi-docker-di-board-arm&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;1. Gunakan Image Alpine atau Slim&lt;/strong&gt;&lt;a href=&quot;#1-gunakan-image-alpine-atau-slim&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Image berbasis Alpine lebih kecil dan hemat RAM:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nginx:alpine&lt;/code&gt; vs &lt;code&gt;nginx:latest&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;python:3.11-alpine&lt;/code&gt; vs &lt;code&gt;python:3.11&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;2. Limit Resource Container&lt;/strong&gt;&lt;a href=&quot;#2-limit-resource-container&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;yaml&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;some-image&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    deploy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      resources&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        limits&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          cpus&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;1.0&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          memory&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;512M&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;3. Enable Docker Log Rotation&lt;/strong&gt;&lt;a href=&quot;#3-enable-docker-log-rotation&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Edit &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JSON&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;log-driver&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;json-file&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;log-opts&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;max-size&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;10m&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;max-file&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;3&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Restart Docker:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; restart&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Kesimpulan&lt;/strong&gt;&lt;a href=&quot;#kesimpulan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dengan Docker di Armbian, Anda bisa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Menjalankan &lt;strong&gt;banyak aplikasi&lt;/strong&gt; dalam satu board tanpa konflik dependency&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mudah backup&lt;/strong&gt; dan restore project&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eksperimen aman&lt;/strong&gt; — salah konfigurasi? Hapus container dan ulang&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploy cepat&lt;/strong&gt; — cukup &lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dari web server sederhana hingga smart home server, Docker membuat manajemen aplikasi di board ARM menjadi jauh lebih mudah dan terstruktur.&lt;/p&gt;
&lt;p&gt;Selamat mencoba! &lt;/p&gt;</content:encoded><category>category:armbian</category><category>tag:armbian</category></item><item><title>5 Project Keren yang Bisa Dibuat dengan Armbian di Board ARM</title><link>https://webku-7lt.pages.dev/ja/post/5-project-keren-yang-bisa-dibuat-dengan-armbian-di-board-arm</link><guid isPermaLink="false">ja:5-project-keren-yang-bisa-dibuat-dengan-armbian-di-board-arm</guid><description>Temukan 5 project praktis menggunakan Armbian di board ARM: NAS pribadi, Pi-hole ad blocker, Home Assistant, Jellyfin media server, dan web server dengan Docker.</description><pubDate>Mon, 15 Jun 2026 20:57:00 GMT</pubDate><content:encoded>&lt;h1&gt;5 Project Keren yang Bisa Dibuat dengan Armbian di Board ARM&lt;a href=&quot;#5-project-keren-yang-bisa-dibuat-dengan-armbian-di-board-arm&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;Pendahuluan&lt;a href=&quot;#pendahuluan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Setelah berhasil menginstall Armbian di board ARM seperti Orange Pi, NanoPi, atau Rock Pi, banyak pengguna bertanya-tanya: &lt;em&gt;“Lalu, mau diapain?”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Board ARM yang menjalankan Armbian sebenarnya adalah &lt;strong&gt;mini komputer Linux&lt;/strong&gt; yang sangat powerful. Dengan konsumsi daya rendah (biasanya 5-15 watt), board ini bisa berjalan 24/7 tanpa khawatir tagihan listrik membengkak. Berikut adalah &lt;strong&gt;5 project praktis&lt;/strong&gt; yang bisa Anda bangun dengan Armbian.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Project 1: Personal NAS (Network Attached Storage)&lt;a href=&quot;#project-1-personal-nas-network-attached-storage&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Jadikan board ARM Anda sebagai cloud storage pribadi di rumah.&lt;/p&gt;
&lt;h3&gt;Mengapa NAS?&lt;a href=&quot;#mengapa-nas&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Akses file&lt;/strong&gt; dari mana saja dalam jaringan rumah&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backup otomatis&lt;/strong&gt; dari laptop dan smartphone&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Biaya rendah&lt;/strong&gt; dibanding beli NAS komersial (Synology, QNAP)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Tools yang Digunakan&lt;a href=&quot;#tools-yang-digunakan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Software&lt;/th&gt;&lt;th&gt;Fungsi&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Samba&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Sharing folder ke Windows/Mac/Linux&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;OpenMediaVault (OMV)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Web-based NAS management&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Syncthing&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Sinkronisasi file antar device&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Nextcloud&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Cloud storage dengan web interface&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Langkah Singkat&lt;a href=&quot;#langkah-singkat&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# Install Samba&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; apt&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; samba&lt;/span&gt;&lt;span&gt; samba-common-bin&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Setup shared folder&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; mkdir&lt;/span&gt;&lt;span&gt; -p&lt;/span&gt;&lt;span&gt; /mnt/nas-storage&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; chmod&lt;/span&gt;&lt;span&gt; 777&lt;/span&gt;&lt;span&gt; /mnt/nas-storage&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Edit konfigurasi Samba&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; nano&lt;/span&gt;&lt;span&gt; /etc/samba/smb.conf&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Tambahkan di bagian bawah:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;[nas-share]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; /mnt/nas-storage&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;writeable&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; yes&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; mask&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; 0777&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;directory&lt;/span&gt;&lt;span&gt; mask&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; 0777&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; yes&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Restart Samba&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; restart&lt;/span&gt;&lt;span&gt; smb&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tips&lt;/strong&gt;: Tambahkan hard disk USB 3.0 eksternal untuk kapasitas besar. Format dengan &lt;code&gt;ext4&lt;/code&gt; agar lebih cepat dan stabil.\&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;strong&gt;Project 2: Pi-hole — Ad Blocker untuk Seluruh Jaringan&lt;/strong&gt;&lt;a href=&quot;#project-2-pi-hole--ad-blocker-untuk-seluruh-jaringan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Blokir iklan dan tracker di semua device rumah Anda dengan sekali setup.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Cara Kerja Pi-hole&lt;/strong&gt;&lt;a href=&quot;#cara-kerja-pi-hole&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pi-hole bertindak sebagai &lt;strong&gt;DNS server&lt;/strong&gt; di jaringan Anda. Setiap kali device meminta akses ke domain iklan (misalnya &lt;code&gt;googleadservices.com&lt;/code&gt;), Pi-hole akan memblokirnya sebelum iklan terdownload.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Keuntungan&lt;/strong&gt;&lt;a href=&quot;#keuntungan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Blokir iklan di &lt;strong&gt;semua device&lt;/strong&gt; (HP, laptop, TV smart, bahkan console game)&lt;/li&gt;
&lt;li&gt;Blokir &lt;strong&gt;tracker dan malware&lt;/strong&gt; domain&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lihat statistik&lt;/strong&gt; website apa saja yang diakses di rumah&lt;/li&gt;
&lt;li&gt;Hemat &lt;strong&gt;bandwidth&lt;/strong&gt; dan baterai HP&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;Install Pi-hole di Armbian&lt;/strong&gt;&lt;a href=&quot;#install-pi-hole-di-armbian&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# One-liner install Pi-hole&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -sSL&lt;/span&gt;&lt;span&gt; https://install.pi-hole.net&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Setelah install, arahkan DNS router Anda ke IP board ARM. Atau set DNS manual di setiap device:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Primary DNS&lt;/strong&gt;: IP board ARM Anda&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secondary DNS&lt;/strong&gt;: &lt;code&gt;1.1.1.1&lt;/code&gt; (Cloudflare) sebagai backup&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Akses Dashboard&lt;/strong&gt;: Buka &lt;code&gt;http://IP-BOARD/admin&lt;/code&gt; di browser.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Project 3: Home Assistant — Smart Home Server&lt;/strong&gt;&lt;a href=&quot;#project-3-home-assistant--smart-home-server&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Kendalikan lampu, AC, kipas, dan sensor IoT dari satu dashboard.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Apa itu Home Assistant?&lt;/strong&gt;&lt;a href=&quot;#apa-itu-home-assistant&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Home Assistant adalah platform &lt;strong&gt;open-source home automation&lt;/strong&gt; yang mendukung ribuan device dari berbagai merek: Xiaomi, Philips Hue, Tuya, Sonoff, ESP8266, dan banyak lagi.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Kenapa Jalankan di Armbian?&lt;/strong&gt;&lt;a href=&quot;#kenapa-jalankan-di-armbian&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Privasi&lt;/strong&gt; — data smart home Anda tidak dikirim ke cloud pihak ketiga&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lokal&lt;/strong&gt; — berjalan 100% di jaringan rumah, internet mati pun tetap jalan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gratis&lt;/strong&gt; — tidak perlu berlangganan layanan cloud&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;Install Home Assistant Container&lt;/strong&gt;&lt;a href=&quot;#install-home-assistant-container&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# Install Docker terlebih dahulu&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; apt&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; docker.io&lt;/span&gt;&lt;span&gt; docker-compose&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; enable&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Jalankan Home Assistant&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; homeassistant&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --privileged&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --restart=unless-stopped&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -e&lt;/span&gt;&lt;span&gt; TZ=Asia/Jakarta&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; /home/&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;whoami&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;/homeassistant:/config&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --network=host&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ghcr.io/home-assistant/home-assistant:stable&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Akses UI&lt;/strong&gt;: &lt;code&gt;http://IP-BOARD:8123&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dengan Home Assistant, Anda bisa membuat &lt;strong&gt;automasi&lt;/strong&gt; seperti: &lt;em&gt;“Jika sensor gerak terdeteksi di malam hari, nyalakan lampu hallway selama 5 menit.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Project 4: Media Server dengan Jellyfin&lt;/strong&gt;&lt;a href=&quot;#project-4-media-server-dengan-jellyfin&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Streaming film, musik, dan foto koleksi pribadi ke TV, HP, atau laptop.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Jellyfin vs Plex&lt;/strong&gt;&lt;a href=&quot;#jellyfin-vs-plex&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Table&lt;/strong&gt;&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;Fitur&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;Jellyfin&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;Plex&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Harga&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Gratis &amp;amp; open-source&lt;/td&gt;&lt;td&gt;Freemium (fitur premium berbayar)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Privasi&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;100% lokal&lt;/td&gt;&lt;td&gt;Memerlukan akun cloud&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Transcoding&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Tergantung hardware board&lt;/td&gt;&lt;td&gt;Sama&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Plugin&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Aktif dikembangkan komunitas&lt;/td&gt;&lt;td&gt;Lebih mature&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;&lt;strong&gt;Install Jellyfin&lt;/strong&gt;&lt;a href=&quot;#install-jellyfin&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# Tambahkan repo Jellyfin&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -fsSL&lt;/span&gt;&lt;span&gt; https://repo.jellyfin.org/debian/jellyfin_team.gpg.key&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; sudo&lt;/span&gt;&lt;span&gt; gpg&lt;/span&gt;&lt;span&gt; --dearmor&lt;/span&gt;&lt;span&gt; -o&lt;/span&gt;&lt;span&gt; /usr/share/keyrings/jellyfin.gpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Tambahkan source list&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;deb [signed-by=/usr/share/keyrings/jellyfin.gpg] https://repo.jellyfin.org/debian $(&lt;/span&gt;&lt;span&gt;lsb_release&lt;/span&gt;&lt;span&gt; -cs&lt;/span&gt;&lt;span&gt;) main&quot;&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; sudo&lt;/span&gt;&lt;span&gt; tee&lt;/span&gt;&lt;span&gt; /etc/apt/sources.list.d/jellyfin.list&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Install&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; apt&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; apt&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; jellyfin&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Enable service&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; enable&lt;/span&gt;&lt;span&gt; --now&lt;/span&gt;&lt;span&gt; jellyfin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Akses UI&lt;/strong&gt;: &lt;code&gt;http://IP-BOARD:8096&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tips Transcoding&lt;/strong&gt;: Board ARM dengan GPU Mali (seperti Orange Pi 5) mendukung &lt;strong&gt;hardware transcoding&lt;/strong&gt; via FFmpeg. Ini memungkinkan streaming 4K ke device lemah tanpa patah-patah.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Project 5: Web Server + Reverse Proxy (Nginx + Docker)&lt;/strong&gt;&lt;a href=&quot;#project-5-web-server--reverse-proxy-nginx--docker&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Host website pribadi, blog, atau aplikasi web di board ARM Anda sendiri.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Stack yang Digunakan&lt;/strong&gt;&lt;a href=&quot;#stack-yang-digunakan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Table&lt;/strong&gt;&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;Komponen&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;Fungsi&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Nginx Proxy Manager&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Reverse proxy + SSL otomatis (Let’s Encrypt)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Docker + Portainer&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Manajemen container via GUI&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;WordPress / Ghost&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;CMS untuk blog&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Uptime Kuma&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Monitoring uptime website&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;&lt;strong&gt;Setup dengan Docker Compose&lt;/strong&gt;&lt;a href=&quot;#setup-dengan-docker-compose&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# Buat folder project&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; ~/docker-server&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; ~/docker-server&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Buat file docker-compose.yml&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; docker-compose.yml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Isi &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;yaml&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;3&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nginx-proxy-manager&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;jc21/nginx-proxy-manager:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;80:80&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;81:81&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;443:443&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./npm-data:/data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./letsencrypt:/etc/letsencrypt&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  portainer&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;portainer/portainer-ce:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;9000:9000&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./portainer-data:/data&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jalankan:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; docker-compose&lt;/span&gt;&lt;span&gt; up&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Akses Nginx Proxy Manager&lt;/strong&gt;: &lt;code&gt;http://IP-BOARD:81&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;Akses Portainer&lt;/strong&gt;: &lt;code&gt;http://IP-BOARD:9000&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dengan Nginx Proxy Manager, Anda bisa mendapatkan &lt;strong&gt;SSL gratis&lt;/strong&gt; dari Let’s Encrypt untuk domain Anda (misal: &lt;code&gt;blog.rumahku.duckdns.org&lt;/code&gt;) dengan sekali klik.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Perbandingan Daya dan Biaya&lt;/strong&gt;&lt;a href=&quot;#perbandingan-daya-dan-biaya&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Table&lt;/strong&gt;&lt;/p&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;Project&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;CPU Usage&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;RAM Usage&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;Cocok untuk Board&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;NAS (Samba)&lt;/td&gt;&lt;td&gt;Rendah&lt;/td&gt;&lt;td&gt;100-200 MB&lt;/td&gt;&lt;td&gt;Orange Pi Zero 2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pi-hole&lt;/td&gt;&lt;td&gt;Sangat rendah&lt;/td&gt;&lt;td&gt;50-100 MB&lt;/td&gt;&lt;td&gt;NanoPi NEO&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Home Assistant&lt;/td&gt;&lt;td&gt;Sedang&lt;/td&gt;&lt;td&gt;300-500 MB&lt;/td&gt;&lt;td&gt;Orange Pi 3 LTS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Jellyfin&lt;/td&gt;&lt;td&gt;Tinggi (saat transcode)&lt;/td&gt;&lt;td&gt;500 MB - 1 GB&lt;/td&gt;&lt;td&gt;Orange Pi 5 / RK3588&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Web Server&lt;/td&gt;&lt;td&gt;Rendah-Sedang&lt;/td&gt;&lt;td&gt;200-400 MB&lt;/td&gt;&lt;td&gt;Banana Pi M5&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan&lt;/strong&gt;: Board dengan RAM 1GB masih cukup untuk project 1-3. Untuk Jellyfin dan web server, disarankan minimal &lt;strong&gt;2GB RAM&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Kesimpulan&lt;/strong&gt;&lt;a href=&quot;#kesimpulan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Board ARM + Armbian adalah kombinasi yang sangat &lt;strong&gt;versatile&lt;/strong&gt; dan &lt;strong&gt;hemat biaya&lt;/strong&gt;. Dengan investasi board seharga &lt;strong&gt;Rp 200 ribu - 1 jutaan&lt;/strong&gt;, Anda bisa membangun:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloud storage pribadi&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ad blocker jaringan&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smart home server&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Media streaming server&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web server pribadi&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Semua project ini berjalan &lt;strong&gt;24/7&lt;/strong&gt; dengan konsumsi daya setara &lt;strong&gt;1-2 lampu LED&lt;/strong&gt;. Jauh lebih hemat dibanding menyewa VPS cloud yang biayanya puluhan dollar per bulan.&lt;/p&gt;</content:encoded><category>category:armbian</category><category>tag:armbian</category></item><item><title>Kimi AI - Asisten Cerdas dari Tiongkok yang Mengubah Cara Kita Bekerja</title><link>https://webku-7lt.pages.dev/ja/post/kimi-ai-asisten-cerdas-dari-tiongkok-yang-mengubah-cara-kita-bekerja</link><guid isPermaLink="false">ja:kimi-ai-asisten-cerdas-dari-tiongkok-yang-mengubah-cara-kita-bekerja</guid><description>Kimi AI, asisten buatan Moonshot AI dari Tiongkok, menawarkan kemampuan memproses dokumen panjang dan pemahaman konteks yang mendalam. Pelajari keunggulan dan cara menggunakannya.</description><pubDate>Mon, 15 Jun 2026 20:26:00 GMT</pubDate><content:encoded>&lt;h1&gt;Kimi AI: Asisten Cerdas dari Tiongkok yang Mengubah Cara Kita Bekerja&lt;a href=&quot;#kimi-ai-asisten-cerdas-dari-tiongkok-yang-mengubah-cara-kita-bekerja&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;Pengenalan&lt;a href=&quot;#pengenalan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Di era kecerdasan buatan yang semakin kompetitif, &lt;strong&gt;Kimi AI&lt;/strong&gt; hadir sebagai salah satu asisten AI paling menonjol dari Tiongkok. Dikembangkan oleh &lt;strong&gt;Moonshot AI&lt;/strong&gt; (月之暗面), Kimi AI menawarkan kemampuan pemrosesan teks yang luar biasa dengan fokus pada penanganan dokumen panjang dan pemahaman konteks yang mendalam.&lt;/p&gt;
&lt;h2&gt;Apa itu Kimi AI?&lt;a href=&quot;#apa-itu-kimi-ai&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Kimi AI adalah model bahasa besar (Large Language Model/LLM) yang dirancang untuk menjadi asisten pribadi yang mampu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Memproses dokumen hingga ratusan ribu kata&lt;/strong&gt; dalam satu sesi&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memahami konteks panjang&lt;/strong&gt; dengan sangat baik&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Menjawab pertanyaan kompleks&lt;/strong&gt; dalam berbagai bidang&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Membantu penulisan, analisis, dan riset&lt;/strong&gt; dengan akurat&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Keunggulan Utama Kimi AI&lt;a href=&quot;#keunggulan-utama-kimi-ai&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;1. Context Window yang Sangat Besar&lt;a href=&quot;#1-context-window-yang-sangat-besar&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Salah satu keunggulan terbesar Kimi AI adalah kemampuannya menangani &lt;strong&gt;context window&lt;/strong&gt; yang sangat panjang. Dibandingkan banyak model AI lainnya, Kimi dapat memproses dokumen panjang seperti laporan, kontrak, atau buku tanpa kehilangan konteks.&lt;/p&gt;
&lt;h3&gt;2. Dukungan Bahasa yang Kuat&lt;a href=&quot;#2-dukungan-bahasa-yang-kuat&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Kimi AI memiliki pemahaman mendalam terhadap &lt;strong&gt;bahasa Mandarin&lt;/strong&gt; dan juga berbagai bahasa lainnya, termasuk bahasa Indonesia, Inggris, dan banyak bahasa Asia lainnya.&lt;/p&gt;
&lt;h3&gt;3. Integrasi dengan Berbagai Format&lt;a href=&quot;#3-integrasi-dengan-berbagai-format&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Kimi dapat membaca dan menganalisis berbagai format dokumen seperti:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PDF&lt;/li&gt;
&lt;li&gt;Word (DOC/DOCX)&lt;/li&gt;
&lt;li&gt;File teks&lt;/li&gt;
&lt;li&gt;Gambar (untuk versi tertentu)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. Kecepatan dan Akurasi&lt;a href=&quot;#4-kecepatan-dan-akurasi&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Dengan arsitektur modern, Kimi AI mampu memberikan respons yang cepat dan akurat, bahkan untuk pertanyaan teknis atau analisis data.&lt;/p&gt;
&lt;h2&gt;Cara Menggunakan Kimi AI&lt;a href=&quot;#cara-menggunakan-kimi-ai&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pengguna dapat mengakses Kimi AI melalui:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Website resmi&lt;/strong&gt;: &lt;a href=&quot;https://kimi.moonshot.cn&quot;&gt;kimi.moonshot.cn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aplikasi mobile&lt;/strong&gt;: tersedia di iOS dan Android&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API&lt;/strong&gt;: untuk pengembang yang ingin mengintegrasikan Kimi ke dalam aplikasi mereka&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Perbandingan dengan Asisten AI Lainnya&lt;a href=&quot;#perbandingan-dengan-asisten-ai-lainnya&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Fitur&lt;/th&gt;&lt;th&gt;Kimi AI&lt;/th&gt;&lt;th&gt;ChatGPT&lt;/th&gt;&lt;th&gt;Claude&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Context Window&lt;/td&gt;&lt;td&gt;Sangat besar&lt;/td&gt;&lt;td&gt;Besar&lt;/td&gt;&lt;td&gt;Sangat besar&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Bahasa Mandarin&lt;/td&gt;&lt;td&gt;⭐⭐⭐&lt;/td&gt;&lt;td&gt;⭐⭐&lt;/td&gt;&lt;td&gt;⭐⭐&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Analisis Dokumen&lt;/td&gt;&lt;td&gt;⭐⭐⭐&lt;/td&gt;&lt;td&gt;⭐⭐⭐&lt;/td&gt;&lt;td&gt;⭐⭐⭐&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Kecepatan&lt;/td&gt;&lt;td&gt;⭐⭐⭐&lt;/td&gt;&lt;td&gt;⭐⭐⭐&lt;/td&gt;&lt;td&gt;⭐⭐⭐&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Kesimpulan&lt;a href=&quot;#kesimpulan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Kimi AI merupakan bukti bahwa inovasi dalam bidang kecerdasan buatan tidak hanya berpusat di Silicon Valley. Dengan kemampuan memproses dokumen panjang, pemahaman bahasa yang kuat, dan performa yang handal, Kimi AI layak menjadi pilihan bagi siapa saja yang membutuhkan asisten digital cerdas.&lt;/p&gt;
&lt;p&gt;Baik Anda seorang penulis, peneliti, pengusaha, atau pelajar, Kimi AI dapat membantu meningkatkan produktivitas dan efisiensi kerja Anda.&lt;/p&gt;</content:encoded><category>category:AI</category><category>tag:Kimi AI</category><category>tag:Teknologi</category></item><item><title>Rust Web Development: Membuat REST API dengan Actix-web</title><link>https://webku-7lt.pages.dev/ja/post/rust-web-development-rest-api-actix-web</link><guid isPermaLink="false">ja:rust-web-development-rest-api-actix-web</guid><description>Tutorial praktis membangun REST API dengan Rust dan Actix-web: routing, handler, JSON, middleware, error handling, dan database integration � lengkap dengan code blocks.</description><pubDate>Mon, 15 Jun 2026 19:50:00 GMT</pubDate><content:encoded>&lt;p&gt;Rust bukan hanya untuk sistem programming dan CLI tools — ia juga sangat powerful untuk web development. Dengan framework seperti Actix-web, kamu bisa membangun REST API yang cepat, aman, dan scalable. Artikel ini membawa kamu membangun API lengkap dari nol.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Apa Itu Actix-web?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Actix-web adalah framework web untuk Rust yang berbasis actor system. Ia menawarkan:&lt;/p&gt;
&lt;p&gt;• &lt;strong&gt;Performa tinggi&lt;/strong&gt; — salah satu framework web tercepat di benchmark&lt;br /&gt;
• &lt;strong&gt;Type-safe routing&lt;/strong&gt; — routing diperiksa pada waktu kompilasi&lt;br /&gt;
• &lt;strong&gt;Middleware&lt;/strong&gt; yang fleksibel dan composable&lt;br /&gt;
• &lt;strong&gt;Async/await&lt;/strong&gt; native&lt;br /&gt;
• &lt;strong&gt;Auto-reload&lt;/strong&gt; untuk development&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Setup Project&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Buat project baru dan tambahkan dependency:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; rust-api&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; rust-api&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;package&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;name = &lt;/span&gt;&lt;span&gt;&quot;rust-api&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;version = &lt;/span&gt;&lt;span&gt;&quot;0.1.0&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;edition = &lt;/span&gt;&lt;span&gt;&quot;2021&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;actix-web = &lt;/span&gt;&lt;span&gt;&quot;4&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;serde = { version = &lt;/span&gt;&lt;span&gt;&quot;1.0&quot;&lt;/span&gt;&lt;span&gt;, features = [&lt;/span&gt;&lt;span&gt;&quot;derive&quot;&lt;/span&gt;&lt;span&gt;] }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;serde_json = &lt;/span&gt;&lt;span&gt;&quot;1.0&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. Hello World Server&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Server Actix-web paling sederhana:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; actix_web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;{get, &lt;/span&gt;&lt;span&gt;App&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;HttpServer&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Responder&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[get(&lt;/span&gt;&lt;span&gt;&quot;/&quot;&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; hello&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; impl&lt;/span&gt;&lt;span&gt; Responder&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;Hello, Rust API!&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[actix_web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;main]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;()&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    HttpServer&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        App&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;service&lt;/span&gt;&lt;span&gt;(hello)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    })&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;8080&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .await&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jalankan dengan:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Test dengan curl:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http://localhost:8080/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;4. Routing dengan Parameter&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Actix-web mendukung path parameter dan query parameter:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; actix_web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;{get, web, &lt;/span&gt;&lt;span&gt;App&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;HttpServer&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Responder&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[get(&lt;/span&gt;&lt;span&gt;&quot;/user/{id}&quot;&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; get_user&lt;/span&gt;&lt;span&gt;(path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Path&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; impl&lt;/span&gt;&lt;span&gt; Responder&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;User ID: {}&quot;&lt;/span&gt;&lt;span&gt;, path&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;into_inner&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[get(&lt;/span&gt;&lt;span&gt;&quot;/search&quot;&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; search&lt;/span&gt;&lt;span&gt;(info&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Query&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; impl&lt;/span&gt;&lt;span&gt; Responder&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Searching for: {}&quot;&lt;/span&gt;&lt;span&gt;, info&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;q)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[derive(serde&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Deserialize&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; SearchInfo&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    q&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[actix_web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;main]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;()&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    HttpServer&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        App&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;service&lt;/span&gt;&lt;span&gt;(get_user)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;service&lt;/span&gt;&lt;span&gt;(search)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    })&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;8080&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .await&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Test:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http://localhost:8080/user/42&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &quot;http://localhost:8080/search?q=rust&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;5. JSON Request dan Response&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Actix-web otomatis meng-handle serialisasi dan deserialisasi JSON:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; actix_web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;{post, web, &lt;/span&gt;&lt;span&gt;App&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;HttpServer&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;HttpResponse&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Responder&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; serde&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;Deserialize&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Serialize&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[derive(&lt;/span&gt;&lt;span&gt;Serialize&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Deserialize&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; User&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    email&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[derive(&lt;/span&gt;&lt;span&gt;Serialize&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; ApiResponse&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    success&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; bool&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; T&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[post(&lt;/span&gt;&lt;span&gt;&quot;/users&quot;&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; create_user&lt;/span&gt;&lt;span&gt;(user&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Json&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; impl&lt;/span&gt;&lt;span&gt; Responder&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; response &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ApiResponse&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        success&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; user&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;into_inner&lt;/span&gt;&lt;span&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    HttpResponse&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Ok&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(response)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[get(&lt;/span&gt;&lt;span&gt;&quot;/users/{id}&quot;&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; get_user_by_id&lt;/span&gt;&lt;span&gt;(path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Path&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; impl&lt;/span&gt;&lt;span&gt; Responder&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; user &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; User&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; path&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;into_inner&lt;/span&gt;&lt;span&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Alice&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        email&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;alice@example.com&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    HttpResponse&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Ok&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ApiResponse&lt;/span&gt;&lt;span&gt; { success&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;, data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; user })&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[actix_web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;main]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;()&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    HttpServer&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        App&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;service&lt;/span&gt;&lt;span&gt;(create_user)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;service&lt;/span&gt;&lt;span&gt;(get_user_by_id)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    })&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;8080&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .await&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Test JSON API:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -X&lt;/span&gt;&lt;span&gt; POST&lt;/span&gt;&lt;span&gt; http://localhost:8080/users&lt;/span&gt;&lt;span&gt;   -H&lt;/span&gt;&lt;span&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span&gt;   -d&lt;/span&gt;&lt;span&gt; &apos;{&quot;id&quot;: 1, &quot;name&quot;: &quot;Alice&quot;, &quot;email&quot;: &quot;alice@example.com&quot;}&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http://localhost:8080/users/1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;6. State dan Data Sharing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Gunakan &lt;code&gt;web::Data&lt;/code&gt; untuk berbagi state antar handler:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; actix_web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;{web, &lt;/span&gt;&lt;span&gt;App&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;HttpServer&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;HttpResponse&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Responder&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;sync&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Mutex&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; AppState&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    counter&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Mutex&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; counter&lt;/span&gt;&lt;span&gt;(data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Data&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; impl&lt;/span&gt;&lt;span&gt; Responder&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; counter &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;counter&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lock&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    *&lt;/span&gt;&lt;span&gt;counter &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    HttpResponse&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Ok&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Count: {}&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;counter))&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[actix_web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;main]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;()&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; app_state &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Data&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;AppState&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        counter&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Mutex&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    HttpServer&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;move&lt;/span&gt;&lt;span&gt; ||&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        App&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;app_data&lt;/span&gt;&lt;span&gt;(app_state&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;route&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/counter&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt;(counter))&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    })&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;8080&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .await&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;7. Middleware&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Actix-web menyediakan middleware bawaan dan memungkinkan custom middleware:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; actix_web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;{middleware, web, &lt;/span&gt;&lt;span&gt;App&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;HttpServer&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;HttpResponse&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; hello&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    HttpResponse&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Ok&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello!&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[actix_web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;main]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;()&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    HttpServer&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        App&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;wrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;middleware&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Logger&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;wrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;middleware&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Compress&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;wrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;middleware&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;NormalizePath&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;route&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/hello&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt;(hello))&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    })&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;8080&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .await&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tambahkan di &lt;code&gt;Cargo.toml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;actix-web = &lt;/span&gt;&lt;span&gt;&quot;4&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;env_logger = &lt;/span&gt;&lt;span&gt;&quot;0.11&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Inisialisasi logger di &lt;code&gt;main.rs&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;#[actix_web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;main]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;()&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    env_logger&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;init_from_env&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;env_logger&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;default_filter_or&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;info&quot;&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // ... server code&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;8. Error Handling&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Buat custom error response yang konsisten:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; actix_web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;StatusCode&lt;/span&gt;&lt;span&gt;, web, &lt;/span&gt;&lt;span&gt;HttpResponse&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ResponseError&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; serde&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Serialize&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;fmt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[derive(&lt;/span&gt;&lt;span&gt;Serialize&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; ErrorResponse&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    success&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; bool&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    error&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[derive(&lt;/span&gt;&lt;span&gt;Debug&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;enum&lt;/span&gt;&lt;span&gt; ApiError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    NotFound&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    BadRequest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    InternalError&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;impl&lt;/span&gt;&lt;span&gt; fmt&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Display&lt;/span&gt;&lt;span&gt; for&lt;/span&gt;&lt;span&gt; ApiError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; fmt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;, f&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;mut&lt;/span&gt;&lt;span&gt; fmt&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Formatter&lt;/span&gt;&lt;span&gt;&amp;lt;&apos;&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;&amp;gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; fmt&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        match&lt;/span&gt;&lt;span&gt; self&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            ApiError&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;NotFound&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; write!&lt;/span&gt;&lt;span&gt;(f, &lt;/span&gt;&lt;span&gt;&quot;Resource not found&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            ApiError&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;BadRequest&lt;/span&gt;&lt;span&gt;(msg) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; write!&lt;/span&gt;&lt;span&gt;(f, &lt;/span&gt;&lt;span&gt;&quot;Bad request: {}&quot;&lt;/span&gt;&lt;span&gt;, msg),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            ApiError&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;InternalError&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; write!&lt;/span&gt;&lt;span&gt;(f, &lt;/span&gt;&lt;span&gt;&quot;Internal server error&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;impl&lt;/span&gt;&lt;span&gt; ResponseError&lt;/span&gt;&lt;span&gt; for&lt;/span&gt;&lt;span&gt; ApiError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; status_code&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; StatusCode&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        match&lt;/span&gt;&lt;span&gt; self&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            ApiError&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;NotFound&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; StatusCode&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;NOT_FOUND&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            ApiError&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;BadRequest&lt;/span&gt;&lt;span&gt;(_) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; StatusCode&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;BAD_REQUEST&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            ApiError&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;InternalError&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; StatusCode&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;INTERNAL_SERVER_ERROR&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; error_response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        HttpResponse&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;status_code&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ErrorResponse&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            success&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            error&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; self&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;to_string&lt;/span&gt;&lt;span&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        })&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; get_item&lt;/span&gt;&lt;span&gt;(path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Path&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; id &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; path&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;into_inner&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; id &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        return&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ApiError&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;BadRequest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ID must be &amp;gt; 0&quot;&lt;/span&gt;&lt;span&gt;)));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; id &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; 100&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        return&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ApiError&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;NotFound&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;HttpResponse&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Ok&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;serde_json&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;json!&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;success&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;data&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; id, &lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;Item&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    })))&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;9. CRUD API Lengkap&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In-memory CRUD API dengan Actix-web:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; actix_web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;{delete, get, post, put, web, &lt;/span&gt;&lt;span&gt;App&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;HttpResponse&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;HttpServer&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; serde&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;Deserialize&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Serialize&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;sync&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Mutex&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[derive(&lt;/span&gt;&lt;span&gt;Serialize&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Deserialize&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Clone&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; Todo&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    completed&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; bool&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; AppState&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    todos&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Mutex&lt;/span&gt;&lt;span&gt;&amp;gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    next_id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Mutex&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[get(&lt;/span&gt;&lt;span&gt;&quot;/todos&quot;&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; list_todos&lt;/span&gt;&lt;span&gt;(data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Data&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; todos &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;todos&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lock&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    HttpResponse&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Ok&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;*&lt;/span&gt;&lt;span&gt;todos)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[post(&lt;/span&gt;&lt;span&gt;&quot;/todos&quot;&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; create_todo&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Data&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    todo&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Json&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; todos &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;todos&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lock&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; next_id &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;next_id&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lock&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; new_todo &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Todo&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt;next_id,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; todo&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        completed&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    *&lt;/span&gt;&lt;span&gt;next_id &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    todos&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;(new_todo&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    HttpResponse&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Created&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(new_todo)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[derive(&lt;/span&gt;&lt;span&gt;Deserialize&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; CreateTodo&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[get(&lt;/span&gt;&lt;span&gt;&quot;/todos/{id}&quot;&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; get_todo&lt;/span&gt;&lt;span&gt;(data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Data&lt;/span&gt;&lt;span&gt;, path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Path&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; todos &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;todos&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lock&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    match&lt;/span&gt;&lt;span&gt; todos&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;iter&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; t&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; path&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;into_inner&lt;/span&gt;&lt;span&gt;()) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Some&lt;/span&gt;&lt;span&gt;(todo) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Ok&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(todo),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        None&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;NotFound&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Todo not found&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[put(&lt;/span&gt;&lt;span&gt;&quot;/todos/{id}&quot;&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; update_todo&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Data&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Path&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    update&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Json&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; todos &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;todos&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lock&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    match&lt;/span&gt;&lt;span&gt; todos&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;iter_mut&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; t&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; path&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;into_inner&lt;/span&gt;&lt;span&gt;()) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Some&lt;/span&gt;&lt;span&gt;(todo) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            todo&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;title &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap_or&lt;/span&gt;&lt;span&gt;(todo&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            todo&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;completed &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;completed&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap_or&lt;/span&gt;&lt;span&gt;(todo&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;completed);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            HttpResponse&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Ok&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(todo)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        None&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;NotFound&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Todo not found&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[derive(&lt;/span&gt;&lt;span&gt;Deserialize&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; UpdateTodo&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Option&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    completed&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Option&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[delete(&lt;/span&gt;&lt;span&gt;&quot;/todos/{id}&quot;&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; delete_todo&lt;/span&gt;&lt;span&gt;(data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Data&lt;/span&gt;&lt;span&gt;, path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Path&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; todos &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;todos&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lock&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; id &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; path&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;into_inner&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; initial_len &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; todos&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    todos&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;retain&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; t&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id &lt;/span&gt;&lt;span&gt;!=&lt;/span&gt;&lt;span&gt; id);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; todos&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;() &amp;lt; initial_len {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        HttpResponse&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;NoContent&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;finish&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    } &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        HttpResponse&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;NotFound&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Todo not found&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[actix_web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;main]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;&amp;lt;()&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; state &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Data&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;AppState&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        todos&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Mutex&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;vec!&lt;/span&gt;&lt;span&gt;[]),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        next_id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Mutex&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    HttpServer&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;move&lt;/span&gt;&lt;span&gt; ||&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        App&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;app_data&lt;/span&gt;&lt;span&gt;(state&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;service&lt;/span&gt;&lt;span&gt;(list_todos)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;service&lt;/span&gt;&lt;span&gt;(create_todo)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;service&lt;/span&gt;&lt;span&gt;(get_todo)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;service&lt;/span&gt;&lt;span&gt;(update_todo)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;service&lt;/span&gt;&lt;span&gt;(delete_todo)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    })&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;8080&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .await&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Test CRUD:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -X&lt;/span&gt;&lt;span&gt; POST&lt;/span&gt;&lt;span&gt; http://localhost:8080/todos&lt;/span&gt;&lt;span&gt;   -H&lt;/span&gt;&lt;span&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span&gt;   -d&lt;/span&gt;&lt;span&gt; &apos;{&quot;title&quot;: &quot;Belajar Rust&quot;}&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; http://localhost:8080/todos&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -X&lt;/span&gt;&lt;span&gt; PUT&lt;/span&gt;&lt;span&gt; http://localhost:8080/todos/1&lt;/span&gt;&lt;span&gt;   -H&lt;/span&gt;&lt;span&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span&gt;   -d&lt;/span&gt;&lt;span&gt; &apos;{&quot;completed&quot;: true}&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -X&lt;/span&gt;&lt;span&gt; DELETE&lt;/span&gt;&lt;span&gt; http://localhost:8080/todos/1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;10. Extractors dan Validasi&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Actix-web mendukung banyak extractor untuk data yang berbeda:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; actix_web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;{web, &lt;/span&gt;&lt;span&gt;HttpRequest&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;HttpResponse&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; serde&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Deserialize&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[derive(&lt;/span&gt;&lt;span&gt;Deserialize&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; Pagination&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    page&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Option&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    per_page&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Option&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; list_items&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    req&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; HttpRequest&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    query&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Query&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Option&lt;/span&gt;&lt;span&gt;&amp;gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; HttpResponse&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; page &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; query&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap_or&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; per_page &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; query&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;per_page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap_or&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; user_agent &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; req&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;user-agent&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        .&lt;/span&gt;&lt;span&gt;and_then&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;to_str&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ok&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        .&lt;/span&gt;&lt;span&gt;unwrap_or&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;unknown&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    HttpResponse&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Ok&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;serde_json&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;json!&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;page&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; page,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;per_page&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; per_page,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;user_agent&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; user_agent,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;body_present&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; body&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;is_some&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }))&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Kesimpulan&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Actix-web membuka dunia web development dengan Rust yang cepat dan aman. Dari artikel ini kamu telah belajar:&lt;/p&gt;
&lt;p&gt;• Setup project Actix-web&lt;br /&gt;
• Routing dan parameter&lt;br /&gt;
• JSON request/response otomatis&lt;br /&gt;
• State sharing dengan &lt;code&gt;web::Data&lt;/code&gt;&lt;br /&gt;
• Middleware untuk logging dan kompresi&lt;br /&gt;
• Custom error handling&lt;br /&gt;
• CRUD API lengkap&lt;br /&gt;
• Extractors untuk header, query, dan body&lt;/p&gt;
&lt;p&gt;Selanjutnya, eksplorasi topik seperti: integrasi database dengan &lt;code&gt;sqlx&lt;/code&gt; atau &lt;code&gt;diesel&lt;/code&gt;, authentication dengan JWT, WebSocket, dan deployment ke container.&lt;/p&gt;
&lt;p&gt;Rust untuk web bukan lagi masa depan — ia sudah siap untuk production. &lt;/p&gt;</content:encoded><category>category:tutorial</category><category>tag:rust</category></item><item><title>Rust Async: Pemrograman Asinkron dengan async/await</title><link>https://webku-7lt.pages.dev/ja/post/rust-async-pemrograman-asinkron</link><guid isPermaLink="false">ja:rust-async-pemrograman-asinkron</guid><description>Panduan lengkap asynchronous programming di Rust: futures, async/await, Tokio runtime, concurrent tasks, channels, dan select.</description><pubDate>Mon, 15 Jun 2026 19:45:00 GMT</pubDate><content:encoded>&lt;p&gt;Rust mendukung pemrograman asinkron melalui &lt;code&gt;async/await&lt;/code&gt;, sebuah fitur yang memungkinkan kamu menulis kode non-blocking yang terlihat seperti kode sinkron biasa. Artikel ini membawa kamu dari konsep dasar futures hingga praktik concurrent tasks dengan Tokio.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Apa Itu Async di Rust?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Di Rust, fungsi &lt;code&gt;async&lt;/code&gt; tidak langsung berjalan — ia mengembalikan sebuah &lt;code&gt;Future&lt;/code&gt;. Future adalah nilai yang merepresentasikan komputasi yang belum selesai. Future baru dieksekusi ketika di-&lt;code&gt;await&lt;/code&gt; atau dijalankan oleh runtime.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; hello&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello dari async!&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; future &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; hello&lt;/span&gt;&lt;span&gt;();  &lt;/span&gt;&lt;span&gt;// Future dibuat, tapi belum berjalan&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Kode di sini belum mencetak apa pun&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Untuk menjalankan, butuh runtime atau block_on&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. Menjalankan Future dengan block_on&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cara termudah menjalankan future adalah menggunakan &lt;code&gt;futures::executor::block_on&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; futures&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;executor&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;block_on;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; hello&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello, async world!&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; future &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; hello&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    block_on&lt;/span&gt;&lt;span&gt;(future);  &lt;/span&gt;&lt;span&gt;// blokir sampai future selesai&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tambahkan dependency di &lt;code&gt;Cargo.toml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;futures = &lt;/span&gt;&lt;span&gt;&quot;0.3&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. async/await dalam Praktik&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;await&lt;/code&gt; digunakan di dalam fungsi &lt;code&gt;async&lt;/code&gt; lain untuk menunggu future selesai tanpa memblokir thread:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; async_std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;task;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; tarea_satu&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    task&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;.await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Tarea satu selesai&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; tarea_dua&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    task&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;.await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Tarea dua selesai&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; run_both&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    tarea_satu&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    tarea_dua&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    task&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;block_on&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;run_both&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Perhatikan: kode di atas berjalan &lt;strong&gt;secara berurutan&lt;/strong&gt;, bukan paralel. Total waktu = 1 + 2 = 3 detik.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Menjalankan Task Secara Concurrent&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Untuk menjalankan task secara bersamaan, gunakan &lt;code&gt;join!&lt;/code&gt; atau &lt;code&gt;futures::future::join&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; futures&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;join;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; async_std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;task;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; fetch_user&lt;/span&gt;&lt;span&gt;(id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    task&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;.await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;User {}&quot;&lt;/span&gt;&lt;span&gt;, id)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; fetch_order&lt;/span&gt;&lt;span&gt;(id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    task&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;.await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Order {}&quot;&lt;/span&gt;&lt;span&gt;, id)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; get_data&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; user_future &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; fetch_user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; order_future &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; fetch_order&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;101&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; (user, order) &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; join!&lt;/span&gt;&lt;span&gt;(user_future, order_future);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;{} dan {} diambil bersamaan&quot;&lt;/span&gt;&lt;span&gt;, user, order);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Total waktu ~1 detik, bukan 2 detik!&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    async_std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;task&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;block_on&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;get_data&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;5. Tokio: Runtime Produksi untuk Rust&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tokio adalah runtime async paling populer di Rust. Ia menyediakan thread pool, timer, I/O, dan channel.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tokio = { version = &lt;/span&gt;&lt;span&gt;&quot;1&quot;&lt;/span&gt;&lt;span&gt;, features = [&lt;/span&gt;&lt;span&gt;&quot;full&quot;&lt;/span&gt;&lt;span&gt;] }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;{sleep, &lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; task_a&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;.await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Task A selesai&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; task_b&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;.await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Task B selesai&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;main]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; start &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Instant&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;join!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;task_a&lt;/span&gt;&lt;span&gt;(), &lt;/span&gt;&lt;span&gt;task_b&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Waktu total: {:?}&quot;&lt;/span&gt;&lt;span&gt;, start&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;elapsed&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // ~1 detik, bukan 2 detik!&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;6. Spawning Task&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tokio::spawn&lt;/code&gt; membuat task baru yang berjalan secara independen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;{sleep, &lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;main]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; handle1 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;.await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Spawn 1 selesai&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        42&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; handle2 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;.await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Spawn 2 selesai&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;hello&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; result1 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; handle1&lt;/span&gt;&lt;span&gt;.await.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; result2 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; handle2&lt;/span&gt;&lt;span&gt;.await.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hasil: {} dan {}&quot;&lt;/span&gt;&lt;span&gt;, result1, result2);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;7. Channels untuk Komunikasi antar Task&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;sync&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;mpsc;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;main]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; (tx, &lt;/span&gt;&lt;span&gt;mut&lt;/span&gt;&lt;span&gt; rx) &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; mpsc&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;channel&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;span&gt;// buffer 100&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; tx2 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; tx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; move&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        for&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            tx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;send&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Pesan dari A: {}&quot;&lt;/span&gt;&lt;span&gt;, i))&lt;/span&gt;&lt;span&gt;.await.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; move&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        for&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; 5&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            tx2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;send&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Pesan dari B: {}&quot;&lt;/span&gt;&lt;span&gt;, i))&lt;/span&gt;&lt;span&gt;.await.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    drop&lt;/span&gt;&lt;span&gt;(tx); &lt;/span&gt;&lt;span&gt;// tutup sender agar receiver tahu kapan selesai&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    while&lt;/span&gt;&lt;span&gt; let&lt;/span&gt;&lt;span&gt; Some&lt;/span&gt;&lt;span&gt;(msg) &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; rx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;recv&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.await&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Diterima: {}&quot;&lt;/span&gt;&lt;span&gt;, msg);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Channel selesai&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;8. Select: Menunggu Banyak Future&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tokio::select!&lt;/code&gt; menunggu beberapa future dan menangani yang selesai pertama:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;{sleep, &lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;sync&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;oneshot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;main]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; (tx, rx) &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; oneshot&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;channel&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; move&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;.await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        tx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;send&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Data dari task&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;select!&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        result &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; rx &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            match&lt;/span&gt;&lt;span&gt; result {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                Ok&lt;/span&gt;&lt;span&gt;(msg) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Diterima: {}&quot;&lt;/span&gt;&lt;span&gt;, msg),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                Err&lt;/span&gt;&lt;span&gt;(_) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Sender dropped&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        _ &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from_secs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;)) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Timeout!&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;9. Concurrent Stream Processing&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;{sleep, &lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; download_file&lt;/span&gt;&lt;span&gt;(id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;.await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;File-{}.pdf&quot;&lt;/span&gt;&lt;span&gt;, id)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;main]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; ids &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; vec!&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Sequential (lambat)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    for&lt;/span&gt;&lt;span&gt; id &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;ids {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        let&lt;/span&gt;&lt;span&gt; file &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; download_file&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;id)&lt;/span&gt;&lt;span&gt;.await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Downloaded: {}&quot;&lt;/span&gt;&lt;span&gt;, file);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;--- Sekarang concurrent ---&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Concurrent dengan FuturesUnordered (cepat)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; tasks &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;task&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;JoinSet&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    for&lt;/span&gt;&lt;span&gt; id &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; ids {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        tasks&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;download_file&lt;/span&gt;&lt;span&gt;(id));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    while&lt;/span&gt;&lt;span&gt; let&lt;/span&gt;&lt;span&gt; Some&lt;/span&gt;&lt;span&gt;(res) &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; tasks&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;join_next&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.await&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Downloaded: {}&quot;&lt;/span&gt;&lt;span&gt;, res&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;10. Async Trait&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Trait dengan method async memerlukan crate tambahan seperti &lt;code&gt;async-trait&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async-trait = &lt;/span&gt;&lt;span&gt;&quot;0.1&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; async_trait&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;async_trait;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[async_trait]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;trait&lt;/span&gt;&lt;span&gt; Fetcher&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;, url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; HttpFetcher&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[async_trait]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;impl&lt;/span&gt;&lt;span&gt; Fetcher&lt;/span&gt;&lt;span&gt; for&lt;/span&gt;&lt;span&gt; HttpFetcher&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;, url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Fetched from {}&quot;&lt;/span&gt;&lt;span&gt;, url)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[tokio&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;main]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; fetcher &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; HttpFetcher&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; result &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; fetcher&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;https://rust-lang.org&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.await&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;{}&quot;&lt;/span&gt;&lt;span&gt;, result);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Kesimpulan&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Async programming di Rust menawarkan performa tinggi dengan overhead minimal. Dengan &lt;code&gt;async/await&lt;/code&gt;, kamu bisa menulis kode non-blocking yang bersih dan mudah dibaca. Tokio menyediakan ekosistem lengkap: runtime, I/O, timer, channel, dan utility untuk concurrent programming.&lt;/p&gt;
&lt;p&gt;Hal yang perlu diingat:&lt;/p&gt;
&lt;p&gt;• &lt;code&gt;async fn&lt;/code&gt; mengembalikan &lt;code&gt;Future&lt;/code&gt;, bukan langsung berjalan&lt;br /&gt;
• &lt;code&gt;.await&lt;/code&gt; menunggu future di dalam konteks async&lt;br /&gt;
• &lt;code&gt;tokio::join!&lt;/code&gt; untuk menjalankan task concurrent&lt;br /&gt;
• &lt;code&gt;tokio::spawn&lt;/code&gt; untuk task yang berjalan independen&lt;br /&gt;
• &lt;code&gt;tokio::select!&lt;/code&gt; untuk menangani event yang selesai pertama&lt;br /&gt;
• Channel untuk komunikasi antar task&lt;/p&gt;
&lt;p&gt;Mulailah dengan contoh sederhana, lalu tingkatkan ke aplikasi yang lebih kompleks. Async Rust sangat powerful untuk web server, proxy, game server, dan sistem real-time. Selamat eksplorasi! &lt;/p&gt;</content:encoded><category>category:tutorial</category><category>tag:rust</category></item><item><title>Tutorial Rust: Membuat CLI Tool dari Nol</title><link>https://webku-7lt.pages.dev/ja/post/tutorial-rust-membuat-cli-tool</link><guid isPermaLink="false">ja:tutorial-rust-membuat-cli-tool</guid><description>Tutorial praktis membuat command-line tool dengan Rust: inisialisasi project, parsing argument, membaca file, dan menampilkan output � lengkap dengan code blocks.</description><pubDate>Mon, 15 Jun 2026 19:35:00 GMT</pubDate><content:encoded>&lt;p&gt;Dalam tutorial ini, kamu akan membuat sebuah CLI tool sederhana dengan Rust: aplikasi command-line yang membaca file teks dan menghitung statistik seperti jumlah baris, kata, dan karakter. Kita mulai dari instalasi Rust hingga aplikasi yang bisa dijalankan langsung.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prasyarat&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pastikan kamu sudah menginstal Rust:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; --proto&lt;/span&gt;&lt;span&gt; &apos;=https&apos;&lt;/span&gt;&lt;span&gt; --tlsv1.2&lt;/span&gt;&lt;span&gt; -sSf&lt;/span&gt;&lt;span&gt; https://sh.rustup.rs&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; sh&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;rustc&lt;/span&gt;&lt;span&gt; --version&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; --version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Langkah 1: Inisialisasi Project&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Buat project baru dengan Cargo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; wordcount&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; wordcount&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Struktur folder yang dihasilkan:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;wordcount/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── Cargo.toml&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── src/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   └── main.rs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;└── target/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    └── debug/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Langkah 2: Membaca File&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Edit &lt;code&gt;src/main.rs&lt;/code&gt; untuk membaca file dari command-line:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;env;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;fs;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Vec&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; env&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;collect&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;() &amp;lt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        eprintln!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Penggunaan: wordcount &amp;lt;file&amp;gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;process&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; filename &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;args[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; contents &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; fs&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;read_to_string&lt;/span&gt;&lt;span&gt;(filename)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        .&lt;/span&gt;&lt;span&gt;expect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Tidak bisa membaca file&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Isi file:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{}&quot;&lt;/span&gt;&lt;span&gt;, contents);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jalankan dengan:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;Hello Rust&quot;&lt;/span&gt;&lt;span&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; test.txt&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --&lt;/span&gt;&lt;span&gt; test.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Langkah 3: Menghitung Statistik&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tambahkan fungsi untuk menghitung jumlah baris, kata, dan karakter:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; count_stats&lt;/span&gt;&lt;span&gt;(text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;usize&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;usize&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;usize&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; lines &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lines&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; words &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;split_whitespace&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; chars &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;chars&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    (lines, words, chars)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ganti &lt;code&gt;main&lt;/code&gt; untuk menggunakan fungsi tersebut:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;env;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;fs;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; count_stats&lt;/span&gt;&lt;span&gt;(text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;usize&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;usize&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;usize&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; lines &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lines&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; words &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;split_whitespace&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; chars &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;chars&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    (lines, words, chars)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Vec&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; env&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;collect&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;() &amp;lt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        eprintln!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Penggunaan: wordcount &amp;lt;file&amp;gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;process&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; filename &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;args[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; contents &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; fs&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;read_to_string&lt;/span&gt;&lt;span&gt;(filename)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        .&lt;/span&gt;&lt;span&gt;expect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Tidak bisa membaca file&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; (lines, words, chars) &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; count_stats&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;contents);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;File: {}&quot;&lt;/span&gt;&lt;span&gt;, filename);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;  Baris : {}&quot;&lt;/span&gt;&lt;span&gt;, lines);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;  Kata  : {}&quot;&lt;/span&gt;&lt;span&gt;, words);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;  Karakter: {}&quot;&lt;/span&gt;&lt;span&gt;, chars);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;File: test.txt&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  Baris : 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  Kata  : 2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  Karakter: 11&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Langkah 4: Error Handling yang Lebih Baik&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Gunakan &lt;code&gt;Result&lt;/code&gt; untuk penanganan error yang lebih robust:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;env;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;fs;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;process;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; count_stats&lt;/span&gt;&lt;span&gt;(text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;usize&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;usize&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;usize&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; lines &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lines&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; words &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;split_whitespace&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; chars &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;chars&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    (lines, words, chars)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Vec&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; env&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;collect&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;() &amp;lt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        eprintln!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Penggunaan: wordcount &amp;lt;file&amp;gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        process&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; filename &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;args[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; contents &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; match&lt;/span&gt;&lt;span&gt; fs&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;read_to_string&lt;/span&gt;&lt;span&gt;(filename) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(c) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; c,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(err) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            eprintln!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Error membaca &apos;{}&apos;: {}&quot;&lt;/span&gt;&lt;span&gt;, filename, err);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            process&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; (lines, words, chars) &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; count_stats&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;contents);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;File: {}&quot;&lt;/span&gt;&lt;span&gt;, filename);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;  Baris  : {}&quot;&lt;/span&gt;&lt;span&gt;, lines);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;  Kata   : {}&quot;&lt;/span&gt;&lt;span&gt;, words);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;  Karakter: {}&quot;&lt;/span&gt;&lt;span&gt;, chars);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Langkah 5: Parsing Argumen dengan Struct&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Buat struct untuk menangani argument parsing dengan lebih terstruktur:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;env;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;fs;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;process;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; Config&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    filename&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    show_lines&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; bool&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    show_words&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; bool&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    show_chars&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; bool&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;impl&lt;/span&gt;&lt;span&gt; Config&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt;(args&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;]) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        if&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;() &amp;lt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            return&lt;/span&gt;&lt;span&gt; Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Penggunaan: wordcount &amp;lt;file&amp;gt; [options]&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        let&lt;/span&gt;&lt;span&gt; filename &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; args[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; show_lines &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; show_words &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; show_chars &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        for&lt;/span&gt;&lt;span&gt; arg &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;args[&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            match&lt;/span&gt;&lt;span&gt; arg&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;as_str&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                &quot;--lines-only&quot;&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; { show_words &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;; show_chars &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;; }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                &quot;--words-only&quot;&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; { show_lines &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;; show_chars &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;; }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                &quot;--chars-only&quot;&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; { show_lines &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;; show_words &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;; }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                _ &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Config&lt;/span&gt;&lt;span&gt; { filename, show_lines, show_words, show_chars })&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; count_stats&lt;/span&gt;&lt;span&gt;(text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;usize&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;usize&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;usize&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; lines &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lines&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; words &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;split_whitespace&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; chars &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;chars&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    (lines, words, chars)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Vec&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; env&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;collect&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; config &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Config&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;args)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap_or_else&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;err&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        eprintln!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Error: {}&quot;&lt;/span&gt;&lt;span&gt;, err);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        process&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; contents &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; match&lt;/span&gt;&lt;span&gt; fs&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;read_to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;filename) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(c) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; c,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(err) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            eprintln!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Error membaca &apos;{}&apos;: {}&quot;&lt;/span&gt;&lt;span&gt;, config&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;filename, err);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            process&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; (lines, words, chars) &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; count_stats&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;contents);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;File: {}&quot;&lt;/span&gt;&lt;span&gt;, config&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;filename);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; config&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;show_lines { &lt;/span&gt;&lt;span&gt;println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;  Baris  : {}&quot;&lt;/span&gt;&lt;span&gt;, lines); }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; config&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;show_words  { &lt;/span&gt;&lt;span&gt;println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;  Kata   : {}&quot;&lt;/span&gt;&lt;span&gt;, words); }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; config&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;show_chars { &lt;/span&gt;&lt;span&gt;println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;  Karakter: {}&quot;&lt;/span&gt;&lt;span&gt;, chars); }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jalankan dengan opsi:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --&lt;/span&gt;&lt;span&gt; test.txt&lt;/span&gt;&lt;span&gt; --words-only&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --&lt;/span&gt;&lt;span&gt; test.txt&lt;/span&gt;&lt;span&gt; --lines-only&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Langkah 6: Unit Testing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tambahkan test untuk memastikan fungsi &lt;code&gt;count_stats&lt;/code&gt; bekerja dengan benar:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;#[cfg(test)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;mod&lt;/span&gt;&lt;span&gt; tests&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    use&lt;/span&gt;&lt;span&gt; super&lt;/span&gt;&lt;span&gt;::*&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    #[test]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; test_count_stats&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        let&lt;/span&gt;&lt;span&gt; text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;Hello Rust&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Tutorial CLI&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        let&lt;/span&gt;&lt;span&gt; (lines, words, chars) &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; count_stats&lt;/span&gt;&lt;span&gt;(text);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        assert_eq!&lt;/span&gt;&lt;span&gt;(lines, &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        assert_eq!&lt;/span&gt;&lt;span&gt;(words, &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        assert_eq!&lt;/span&gt;&lt;span&gt;(chars, &lt;/span&gt;&lt;span&gt;24&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    #[test]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; test_count_stats_empty&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        let&lt;/span&gt;&lt;span&gt; text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        let&lt;/span&gt;&lt;span&gt; (lines, words, chars) &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; count_stats&lt;/span&gt;&lt;span&gt;(text);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        assert_eq!&lt;/span&gt;&lt;span&gt;(lines, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        assert_eq!&lt;/span&gt;&lt;span&gt;(words, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        assert_eq!&lt;/span&gt;&lt;span&gt;(chars, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jalankan test:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; test&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Langkah 7: Build untuk Release&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Setelah selesai, build aplikasi untuk release:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; build&lt;/span&gt;&lt;span&gt; --release&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Binary hasil ada di &lt;code&gt;target/release/wordcount&lt;/code&gt;. Bisa langsung dijalankan:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;./target/release/wordcount&lt;/span&gt;&lt;span&gt; test.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Kesimpulan&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Kamu baru saja membuat CLI tool pertama dengan Rust! Dari tutorial ini kamu belajar:&lt;/p&gt;
&lt;p&gt;• Inisialisasi project dengan Cargo&lt;br /&gt;
• Membaca argument dari command-line&lt;br /&gt;
• Membaca dan memproses file&lt;br /&gt;
• Error handling dengan &lt;code&gt;Result&lt;/code&gt;&lt;br /&gt;
• Membuat struct dan method&lt;br /&gt;
• Unit testing&lt;br /&gt;
• Build untuk release&lt;/p&gt;
&lt;p&gt;Lanjutkan eksplorasi dengan menambahkan fitur seperti: membaca multiple file, output ke file, progress bar, atau parsing dengan library seperti &lt;code&gt;clap&lt;/code&gt; untuk argument parsing yang lebih powerful. Selamat coding! &lt;/p&gt;</content:encoded><category>category:tutorial</category><category>tag:rust</category><category>tag:cli</category></item><item><title>Rust Lengkap: Dari Dasar hingga Advanced dengan Code Blocks</title><link>https://webku-7lt.pages.dev/ja/post/rust-lengkap-dasar-hingga-advanced</link><guid isPermaLink="false">ja:rust-lengkap-dasar-hingga-advanced</guid><description>Panduan komprehensif Rust dari nol hingga advanced: ownership, lifetimes, traits, generics, error handling, concurrency, testing, dan macros dengan code blocks lengkap.</description><pubDate>Mon, 15 Jun 2026 19:31:00 GMT</pubDate><content:encoded>&lt;p&gt;Artikel ini adalah panduan komprehensif yang membawa kamu dari nol hingga tingkat mahir dalam Rust. Setiap konsep disertai dengan code block yang bisa langsung dicoba, sehingga kamu tidak hanya membaca teori tapi juga melihat cara kerja kode di praktik.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Variabel dan Tipe Data&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Di Rust, variabel secara default immutable. Gunakan &lt;code&gt;mut&lt;/code&gt; untuk membuatnya mutable.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; name &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;Rust&quot;&lt;/span&gt;&lt;span&gt;;           &lt;/span&gt;&lt;span&gt;// &amp;amp;str (string literal)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; count &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;;           &lt;/span&gt;&lt;span&gt;// mutable i32&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    count &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; pi&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; f64&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; 3.14159&lt;/span&gt;&lt;span&gt;;     &lt;/span&gt;&lt;span&gt;// eksplisit tipe&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; is_ok &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;;           &lt;/span&gt;&lt;span&gt;// boolean&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; letter &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;A&apos;&lt;/span&gt;&lt;span&gt;;           &lt;/span&gt;&lt;span&gt;// char (Unicode)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; numbers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;i32&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;];  &lt;/span&gt;&lt;span&gt;// array fixed-size&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; tuple &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;hello&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;3.14&lt;/span&gt;&lt;span&gt;);      &lt;/span&gt;&lt;span&gt;// tuple&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;nama={}, count={}, pi={}, tuple={:?}&quot;&lt;/span&gt;&lt;span&gt;, name, count, pi, tuple);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. Ownership dan Borrowing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ownership adalah fondasi Rust. Setiap nilai di heap punya satu owner.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; s1 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hello&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; s2 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; s1;              &lt;/span&gt;&lt;span&gt;// ownership berpindah&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // println!(&quot;{}&quot;, s1);    // ERROR: s1 tidak valid lagi&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; s3 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;world&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; len &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; get_length&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;s3); &lt;/span&gt;&lt;span&gt;// borrow — tidak mengambil ownership&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;{} panjangnya {}&quot;&lt;/span&gt;&lt;span&gt;, s3, len);  &lt;/span&gt;&lt;span&gt;// s3 masih valid&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; get_length&lt;/span&gt;&lt;span&gt;(s&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; usize&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    s&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;()  &lt;/span&gt;&lt;span&gt;// pinjam sementara, balikin&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. Lifetimes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lifetime memastikan referensi selalu valid dan tidak dangling.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; s1 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;abcd&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; s2 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;xyz&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; result &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; longest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;s1, s2);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;String terpanjang: {}&quot;&lt;/span&gt;&lt;span&gt;, result);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; longest&lt;/span&gt;&lt;span&gt;&amp;lt;&apos;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&amp;gt;(x&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;, y&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; str&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;() &amp;gt; y&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;() { x } &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; { y }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Penjelasan: &lt;code&gt;&apos;a&lt;/code&gt; adalah lifetime annotation. Parameter dan return value berbagi lifetime yang sama, jadi compiler memastikan semua referensi valid selama hasil dipakai.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Struct dan Enum&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; User&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    username&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    email&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    active&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; bool&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; Point&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;i32&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;i32&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;i32&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;span&gt;// tuple struct&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;enum&lt;/span&gt;&lt;span&gt; Message&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    Quit&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    Move&lt;/span&gt;&lt;span&gt; { x&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; i32&lt;/span&gt;&lt;span&gt;, y&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; i32&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    Write&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ChangeColor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;i32&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;i32&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;i32&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; user &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; User&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        username&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;rustacean&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        email&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hi@rust.dev&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        active&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; msg &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Message&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Move&lt;/span&gt;&lt;span&gt; { x&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 10&lt;/span&gt;&lt;span&gt;, y&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 20&lt;/span&gt;&lt;span&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;User {} aktif: {}&quot;&lt;/span&gt;&lt;span&gt;, user&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;username, user&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;active);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;5. Pattern Matching&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Match di Rust memastikan semua kasus ditangani, tidak ada null pointer exception.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;enum&lt;/span&gt;&lt;span&gt; Coin&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    Penny&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Nickel&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Dime&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Quarter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; value_in_cents&lt;/span&gt;&lt;span&gt;(coin&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Coin&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; u8&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    match&lt;/span&gt;&lt;span&gt; coin {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Coin&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Penny&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Coin&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Nickel&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; 5&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Coin&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Dime&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; 10&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Coin&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Quarter&lt;/span&gt;&lt;span&gt;(state) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Quarter dari {}!&quot;&lt;/span&gt;&lt;span&gt;, state);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            25&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; coin &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Coin&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Quarter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Alaska&quot;&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Nilai: {}&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;value_in_cents&lt;/span&gt;&lt;span&gt;(coin));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; some_number &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; absent_number&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Option&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; None&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    match&lt;/span&gt;&lt;span&gt; some_number {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Some&lt;/span&gt;&lt;span&gt;(n) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Ada angka {}&quot;&lt;/span&gt;&lt;span&gt;, n),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        None&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Tidak ada angka&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // If let — shorthand untuk single pattern&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; let&lt;/span&gt;&lt;span&gt; Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; some_number {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Yup, itu 5!&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;6. Error Handling — Result dan Option&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rust tidak punya exception. Gunakan &lt;code&gt;Result&lt;/code&gt; untuk operasi yang bisa gagal, dan &lt;code&gt;Option&lt;/code&gt; untuk nilai yang mungkin tidak ada.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;fs&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;File&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Read&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; read_username_from_file&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; file &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; File&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hello.txt&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; username &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    file&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;read_to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;mut&lt;/span&gt;&lt;span&gt; username)&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    Ok&lt;/span&gt;&lt;span&gt;(username)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// Sama dengan versi di atas, tapi lebih ringkas&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; read_username_from_file_short&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;fs&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;read_to_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hello.txt&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    match&lt;/span&gt;&lt;span&gt; read_username_from_file&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(name) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Username: {}&quot;&lt;/span&gt;&lt;span&gt;, name),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(e) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Error: {}&quot;&lt;/span&gt;&lt;span&gt;, e),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; greeting_file_result &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; File&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hello.txt&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; greeting_file &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; match&lt;/span&gt;&lt;span&gt; greeting_file_result {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(file) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; file,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(error) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Gagal buka file: {:?}&quot;&lt;/span&gt;&lt;span&gt;, error);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            panic!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;File diperlukan!&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;7. Traits dan Generics&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Traits seperti interface di bahasa lain. Generics membuat kode reusable.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;trait&lt;/span&gt;&lt;span&gt; Summary&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; summarize&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; summarize_author&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Default implementation&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; summarize_detail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        format!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;{}: {}&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;summarize_author&lt;/span&gt;&lt;span&gt;(), &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;summarize&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; NewsArticle&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    headline&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    author&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; Tweet&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    username&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;impl&lt;/span&gt;&lt;span&gt; Summary&lt;/span&gt;&lt;span&gt; for&lt;/span&gt;&lt;span&gt; NewsArticle&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; summarize&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        self&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;headline&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; summarize_author&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        self&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;impl&lt;/span&gt;&lt;span&gt; Summary&lt;/span&gt;&lt;span&gt; for&lt;/span&gt;&lt;span&gt; Tweet&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; summarize&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        self&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; summarize_author&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        self&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;username&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// Generic function dengan trait bound&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; notify&lt;/span&gt;&lt;span&gt;(item&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Breaking! {}&quot;&lt;/span&gt;&lt;span&gt;, item&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;summarize&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; article &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; NewsArticle&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        headline&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Rust 1.80 Dirilis!&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        author&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Rust Team&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; tweet &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Tweet&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        username&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;@rustacean&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Rust itu keren!&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    notify&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;article);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    notify&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;tweet);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;{}&quot;&lt;/span&gt;&lt;span&gt;, article&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;summarize_detail&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;8. Iterators dan Closures&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; v &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; vec!&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Iterator dengan map dan filter&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; doubled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Vec&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;iter&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        .&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        .&lt;/span&gt;&lt;span&gt;collect&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;{:?}&quot;&lt;/span&gt;&lt;span&gt;, doubled);  &lt;/span&gt;&lt;span&gt;// [2, 4, 6, 8, 10]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Filter — ambil yang genap&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; evens&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Vec&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;i32&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;iter&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        .&lt;/span&gt;&lt;span&gt;filter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt;x &lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;span&gt; ==&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        .&lt;/span&gt;&lt;span&gt;collect&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;{:?}&quot;&lt;/span&gt;&lt;span&gt;, evens);  &lt;/span&gt;&lt;span&gt;// [2, 4]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Fold — reduce ke single value&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; sum&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; i32&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;iter&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fold&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;acc, x&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; acc &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; x);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Sum: {}&quot;&lt;/span&gt;&lt;span&gt;, sum);  &lt;/span&gt;&lt;span&gt;// 15&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Closure yang menangkap environment&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; threshold &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 3&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; big&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Vec&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;i32&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;iter&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        .&lt;/span&gt;&lt;span&gt;filter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; **&lt;/span&gt;&lt;span&gt;x &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; threshold)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        .&lt;/span&gt;&lt;span&gt;collect&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Bigger than {}: {:?}&quot;&lt;/span&gt;&lt;span&gt;, threshold, big);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Chaining&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Vec&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;..=&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        .&lt;/span&gt;&lt;span&gt;filter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;span&gt; ==&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        .&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; x)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        .&lt;/span&gt;&lt;span&gt;collect&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Squares of even numbers: {:?}&quot;&lt;/span&gt;&lt;span&gt;, result);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;9. Modules dan Crates&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rust memiliki sistem module yang jelas untuk mengatur kode.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;// src/lib.rs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;mod&lt;/span&gt;&lt;span&gt; front_of_house&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    pub&lt;/span&gt;&lt;span&gt; mod&lt;/span&gt;&lt;span&gt; hosting&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        pub&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; add_to_waitlist&lt;/span&gt;&lt;span&gt;() {}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        fn&lt;/span&gt;&lt;span&gt; seat_at_table&lt;/span&gt;&lt;span&gt;() {}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    mod&lt;/span&gt;&lt;span&gt; serving&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        fn&lt;/span&gt;&lt;span&gt; take_order&lt;/span&gt;&lt;span&gt;() {}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        fn&lt;/span&gt;&lt;span&gt; serve_order&lt;/span&gt;&lt;span&gt;() {}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;mod&lt;/span&gt;&lt;span&gt; back_of_house&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    pub&lt;/span&gt;&lt;span&gt; struct&lt;/span&gt;&lt;span&gt; Breakfast&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        pub&lt;/span&gt;&lt;span&gt; toast&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        seasonal_fruit&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    impl&lt;/span&gt;&lt;span&gt; Breakfast&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        pub&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; summer&lt;/span&gt;&lt;span&gt;(toast&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; Breakfast&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            Breakfast&lt;/span&gt;&lt;span&gt; { toast&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(toast), seasonal_fruit&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;peaches&quot;&lt;/span&gt;&lt;span&gt;) }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pub&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; eat_at_restaurant&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Absolute path&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    crate::&lt;/span&gt;&lt;span&gt;front_of_house&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;hosting&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;add_to_waitlist&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Relative path&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    front_of_house&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;hosting&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;add_to_waitlist&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; meal &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; back_of_house&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Breakfast&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;summer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Rye&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    meal&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toast &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Wheat&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Saya pesan toast {}&quot;&lt;/span&gt;&lt;span&gt;, meal&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toast);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// src/main.rs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; crate::&lt;/span&gt;&lt;span&gt;front_of_house&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;hosting;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() { &lt;/span&gt;&lt;span&gt;hosting&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;add_to_waitlist&lt;/span&gt;&lt;span&gt;(); }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;10. Concurrency — Threads&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rust membuat concurrency aman secara default berkat ownership.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;thread;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; handle &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; thread&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        for&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hi number {} from the spawned thread!&quot;&lt;/span&gt;&lt;span&gt;, i);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            thread&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    for&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hi number {} from the main thread!&quot;&lt;/span&gt;&lt;span&gt;, i);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        thread&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from_millis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    handle&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;join&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();  &lt;/span&gt;&lt;span&gt;// tunggu thread selesai&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Message passing dengan channel&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;sync&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;mpsc;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; (tx, rx) &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; mpsc&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;channel&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    thread&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;move&lt;/span&gt;&lt;span&gt; ||&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        let&lt;/span&gt;&lt;span&gt; val &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hi dari thread&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        tx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;send&lt;/span&gt;&lt;span&gt;(val)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; received &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; rx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;recv&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Diterima: {}&quot;&lt;/span&gt;&lt;span&gt;, received);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Shared state dengan Mutex&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;sync&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;Arc&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Mutex&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; counter &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Arc&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Mutex&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; handles &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; vec!&lt;/span&gt;&lt;span&gt;[];&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    for&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        let&lt;/span&gt;&lt;span&gt; counter &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Arc&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;counter);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        let&lt;/span&gt;&lt;span&gt; handle &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; thread&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;move&lt;/span&gt;&lt;span&gt; ||&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; num &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; counter&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lock&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            *&lt;/span&gt;&lt;span&gt;num &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        });&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        handles&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;(handle);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    for&lt;/span&gt;&lt;span&gt; handle &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; handles {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        handle&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;join&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Result: {}&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;counter&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lock&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;11. Testing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rust punya built-in testing framework yang sangat baik.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pub&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; add&lt;/span&gt;&lt;span&gt;(a&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; i32&lt;/span&gt;&lt;span&gt;, b&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; i32&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; i32&lt;/span&gt;&lt;span&gt; { a &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; b }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pub&lt;/span&gt;&lt;span&gt; fn&lt;/span&gt;&lt;span&gt; divide&lt;/span&gt;&lt;span&gt;(a&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; f64&lt;/span&gt;&lt;span&gt;, b&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; f64&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; Option&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; b &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; 0.0&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;Some&lt;/span&gt;&lt;span&gt;(a &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; b) }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[cfg(test)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;mod&lt;/span&gt;&lt;span&gt; tests&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    use&lt;/span&gt;&lt;span&gt; super&lt;/span&gt;&lt;span&gt;::*&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    #[test]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; test_add&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        assert_eq!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    #[test]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; test_add_negative&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        assert_eq!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    #[test]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; test_divide&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        assert_eq!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;divide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;10.0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;2.0&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;5.0&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        assert_eq!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;divide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;10.0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0.0&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    #[test]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    #[should_panic]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; test_panic&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        panic!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Ini sengaja panic!&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    #[test]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; result_with_question_mark&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; Result&lt;/span&gt;&lt;span&gt;&amp;lt;(), &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        if&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;span&gt; +&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;span&gt; ==&lt;/span&gt;&lt;span&gt; 4&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;Ok&lt;/span&gt;&lt;span&gt;(()) } &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;Err&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;dua plus dua bukan empat&quot;&lt;/span&gt;&lt;span&gt;)) }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jalankan test dengan:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; test&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; test&lt;/span&gt;&lt;span&gt; --&lt;/span&gt;&lt;span&gt; --nocapture&lt;/span&gt;&lt;span&gt;  # tampilkan output print&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; test&lt;/span&gt;&lt;span&gt; test_add&lt;/span&gt;&lt;span&gt;        # jalankan test tertentu&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;12. Macros&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Macros di Rust adalah metaprogramming yang powerful.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;// Declarative macro dengan macro_rules!&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;macro_rules!&lt;/span&gt;&lt;span&gt; say_hello&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    () &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello!&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;macro_rules!&lt;/span&gt;&lt;span&gt; create_function&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    (&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;func_name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;ident) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        fn&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;func_name() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Kamu memanggil {:?}&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;stringify!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;func_name));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;create_function!&lt;/span&gt;&lt;span&gt;(foo);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;create_function!&lt;/span&gt;&lt;span&gt;(bar);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// Procedural macro (contoh sederhana)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// #[derive(Debug)] — menambahkan implementasi trait Debug secara otomatis&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#[derive(&lt;/span&gt;&lt;span&gt;Debug&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Clone&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; Person&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    age&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    say_hello!&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    foo&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    bar&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; p &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Person&lt;/span&gt;&lt;span&gt; { name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Alice&quot;&lt;/span&gt;&lt;span&gt;), age&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 30&lt;/span&gt;&lt;span&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;{:?}&quot;&lt;/span&gt;&lt;span&gt;, p);  &lt;/span&gt;&lt;span&gt;// Debug output&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; p2 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; p&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;{:?}&quot;&lt;/span&gt;&lt;span&gt;, p2);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// macro_rules! dengan variadic arguments&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;macro_rules!&lt;/span&gt;&lt;span&gt; vec_of_strings&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    (&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;expr),&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; temp_vec &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Vec&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            $&lt;/span&gt;&lt;span&gt;( temp_vec&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;x)); )&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            temp_vec&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; use_macro&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; v &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; vec_of_strings!&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;a&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;b&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;c&quot;&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;{:?}&quot;&lt;/span&gt;&lt;span&gt;, v);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Kesimpulan&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rust adalah bahasa yang menuntut disiplin dari programmer, tapi imbalannya sangat besar: kode yang aman dari bug memori, aman dari data race, dan performa setara bahasa native. Mulai dari konsep sederhana seperti variabel dan fungsi, hingga topik advanced seperti lifetimes, traits, dan concurrency — Rust menyediakan tool yang jelas dan compiler yang peduli untuk memandu kamu menulis kode berkualitas tinggi.&lt;/p&gt;
&lt;p&gt;Jangan berkecil hati dengan pesan error yang panjang dari compiler. Pesan-pesan itu sebenarnya adalah bantuan terbaik yang pernah kamu dapatkan dari compiler mana pun. Baca pesan error dengan teliti, perbaiki, kompilasi ulang, dan teruslah praktik. Semangat rustacean! &lt;/p&gt;</content:encoded><category>category:rust</category><category>tag:rust</category></item><item><title>Rust dengan Code Preview: Belajar dari Contoh Praktis</title><link>https://webku-7lt.pages.dev/ja/post/rust-dengan-code-preview</link><guid isPermaLink="false">ja:rust-dengan-code-preview</guid><description>Pelajari Rust melalui contoh kode yang mudah dipahami dari Hello World hingga ownership, borrowing, dan struct.</description><pubDate>Mon, 15 Jun 2026 19:11:00 GMT</pubDate><content:encoded>&lt;p&gt;Salah satu cara terbaik untuk memahami Rust adalah dengan melihat dan mencoba kode langsung. Artikel ini membawa kamu melewati konsep-konsep fundamental Rust melalui contoh kode yang bisa dicoba langsung.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hello World — Program Pertama&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Penjelasan: &lt;code&gt;fn&lt;/code&gt; mendeklarasikan fungsi. &lt;code&gt;println!&lt;/code&gt; adalah macro (ditandai dengan &lt;code&gt;!&lt;/code&gt;) untuk mencetak teks ke konsol. Setiap program Rust dimulai dari fungsi &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Variabel dan Mutability&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 5&lt;/span&gt;&lt;span&gt;;          &lt;/span&gt;&lt;span&gt;// immutable — tidak bisa diubah&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; mut&lt;/span&gt;&lt;span&gt; y &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 10&lt;/span&gt;&lt;span&gt;;     &lt;/span&gt;&lt;span&gt;// mutable — bisa diubah&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    y &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; y &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; 5&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;x = {}, y = {}&quot;&lt;/span&gt;&lt;span&gt;, x, y);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Penjelasan: Secara default, variabel di Rust adalah &lt;strong&gt;immutable&lt;/strong&gt;. Gunakan &lt;code&gt;mut&lt;/code&gt; agar variabel dapat diubah nilainya. Ini mencegah perubahan tidak terduga.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ownership — Konsep Inti Rust&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; s1 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hello&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; s2 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; s1;          &lt;/span&gt;&lt;span&gt;// ownership pindah ke s2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // println!(&quot;{}&quot;, s1); // ERROR! s1 tidak lagi valid&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;{}&quot;&lt;/span&gt;&lt;span&gt;, s2);  &lt;/span&gt;&lt;span&gt;// OK&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Penjelasan: &lt;code&gt;String::from&lt;/code&gt; membuat &lt;code&gt;String&lt;/code&gt; di heap. Saat &lt;code&gt;s1&lt;/code&gt; diberikan ke &lt;code&gt;s2&lt;/code&gt;, ownership berpindah. Rust tidak mengizinkan dua owner untuk satu data di heap — ini mencegah double-free.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Borrowing dengan Referensi&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; s &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hello&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; len &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; calculate_length&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;s);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Panjang &apos;{}&apos; adalah {}.&quot;&lt;/span&gt;&lt;span&gt;, s, len);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; calculate_length&lt;/span&gt;&lt;span&gt;(text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; usize&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Penjelasan: &lt;code&gt;&amp;amp;s&lt;/code&gt; membuat referensi terhadap &lt;code&gt;s&lt;/code&gt; (borrowing). &lt;code&gt;calculate_length&lt;/code&gt; meminjam &lt;code&gt;s&lt;/code&gt; tanpa mengambil ownership. Setelah fungsi selesai, &lt;code&gt;s&lt;/code&gt; masih valid dan bisa dipakai.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Struct dan Method&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; Rectangle&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    width&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;impl&lt;/span&gt;&lt;span&gt; Rectangle&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fn&lt;/span&gt;&lt;span&gt; area&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; u32&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        self&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;width &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; self&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; rect &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Rectangle&lt;/span&gt;&lt;span&gt; { width&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 30&lt;/span&gt;&lt;span&gt;, height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 50&lt;/span&gt;&lt;span&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Luas = {}&quot;&lt;/span&gt;&lt;span&gt;, rect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;area&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Penjelasan: &lt;code&gt;struct&lt;/code&gt; mendefinisikan tipe data kustom. &lt;code&gt;impl&lt;/code&gt; menambahkan method pada struct. &lt;code&gt;&amp;amp;self&lt;/code&gt; adalah referensi ke instance struct, mirip &lt;code&gt;this&lt;/code&gt; di bahasa lain.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enum dan Pattern Matching&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;enum&lt;/span&gt;&lt;span&gt; Message&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    Quit&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    Move&lt;/span&gt;&lt;span&gt; { x&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; i32&lt;/span&gt;&lt;span&gt;, y&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; i32&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    Write&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; msg &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Message&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Move&lt;/span&gt;&lt;span&gt; { x&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 10&lt;/span&gt;&lt;span&gt;, y&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 20&lt;/span&gt;&lt;span&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    match&lt;/span&gt;&lt;span&gt; msg {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Message&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Quit&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Keluar&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Message&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Move&lt;/span&gt;&lt;span&gt; { x, y } &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Pindah ke ({}, {})&quot;&lt;/span&gt;&lt;span&gt;, x, y),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Message&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Write&lt;/span&gt;&lt;span&gt;(text) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Tulis: {}&quot;&lt;/span&gt;&lt;span&gt;, text),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Penjelasan: &lt;code&gt;enum&lt;/code&gt; di Rust bisa menyimpan data berbeda untuk setiap variant. &lt;code&gt;match&lt;/code&gt; memastikan semua kemungkinan ditangani — tidak ada null pointer exception yang tidak terduga.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Result untuk Error Handling&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;fs&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;File&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; greeting_file &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; File&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hello.txt&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    match&lt;/span&gt;&lt;span&gt; greeting_file {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Ok&lt;/span&gt;&lt;span&gt;(file) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;File berhasil dibuka!&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        Err&lt;/span&gt;&lt;span&gt;(error) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Gagal membuka file: {:?}&quot;&lt;/span&gt;&lt;span&gt;, error),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Penjelasan: Rust tidak punya exception. Sebagai gantinya, fungsi yang bisa gagal mengembalikan &lt;code&gt;Result&amp;lt;T, E&amp;gt;&lt;/code&gt;. Kamu wajib menangani kasus &lt;code&gt;Ok&lt;/code&gt; dan &lt;code&gt;Err&lt;/code&gt; — compiler memastikan tidak ada error yang terlewat.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kesimpulan&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rust mungkin punya kurva belajar yang curam, tetapi setiap aturan yang ada punya alasan kuat: keamanan memori, keamanan concurrency, dan performa tinggi. Mulailah dari contoh sederhana di atas, jalankan dengan &lt;code&gt;cargo run&lt;/code&gt;, dan modifikasi untuk melihat apa yang terjadi. Praktik langsung adalah cara tercepat untuk menguasai Rust.&lt;/p&gt;</content:encoded><category>category:tutorial</category><category>tag:rust</category></item><item><title>Mengenal Rust: Bahasa Pemrograman yang Aman dan Performant</title><link>https://webku-7lt.pages.dev/ja/post/mengenal-rust-bahasa-pemrograman</link><guid isPermaLink="false">ja:mengenal-rust-bahasa-pemrograman</guid><description>Rust adalah bahasa pemrograman sistem modern yang menawarkan keamanan memori tanpa garbage collector, concurrency yang aman, dan performa setara C/C++.</description><pubDate>Mon, 15 Jun 2026 19:06:00 GMT</pubDate><content:encoded>&lt;p&gt;Rust telah menjadi salah satu bahasa pemrograman yang paling banyak dibicarakan dalam dekade terakhir. Dikembangkan oleh Mozilla Research dan pertama kali dirilis pada tahun 2010, Rust dirancang untuk mengatasi masalah kritis yang sering dihadapi oleh bahasa pemrograman sistem tradisional seperti C dan C++ — terutama bug terkait memori dan kesulitan dalam menulis kode concurrent yang aman.&lt;/p&gt;
&lt;p&gt;Apa Itu Rust?&lt;/p&gt;
&lt;p&gt;Rust adalah bahasa pemrograman sistem yang dikompilasi secara statis dengan fokus utama pada tiga pilar: keamanan, kecepatan, dan concurrency. Yang membuat Rust istimewa adalah kemampuannya untuk menjamin keamanan memori pada waktu kompilasi tanpa memerlukan garbage collector. Ini berarti program Rust dapat mencapai performa yang setara dengan C/C++ sambil tetap menghindari masalah umum seperti dangling pointers, buffer overflows, dan data races.&lt;/p&gt;
&lt;p&gt;Fitur Utama Rust&lt;/p&gt;
&lt;p&gt;Keamanan Memori Tanpa Garbage Collector&lt;/p&gt;
&lt;p&gt;Rust menggunakan sistem ownership dan borrowing yang unik. Setiap nilai dalam Rust memiliki owner tunggal, dan ketika owner keluar dari scope, nilai tersebut akan dibersihkan secara otomatis. Borrow checker — komponen compiler Rust — memastikan bahwa referensi ke data selalu valid, sehingga mencegah banyak bug keamanan memori pada tahap kompilasi.&lt;/p&gt;
&lt;p&gt;Zero-Cost Abstractions&lt;/p&gt;
&lt;p&gt;Rust menganut prinsip zero-cost abstractions, yang berarti fitur-fitur tingkat tinggi seperti iterators, closures, dan generics tidak menambahkan overhead runtime. Apa yang Anda tulis dalam bentuk abstrak akan dikompilasi menjadi kode mesin yang sama efisiennya dengan kode yang ditulis secara manual.&lt;/p&gt;
&lt;p&gt;Concurrency yang Aman&lt;/p&gt;
&lt;p&gt;Concurrency dalam Rust didesain untuk aman secara default. Sistem ownership mencegah data races karena compiler memastikan bahwa data mutable hanya dapat diakses oleh satu thread pada satu waktu, atau data yang dibagikan bersama adalah immutable. Ini membuat menulis program concurrent dan parallel menjadi jauh lebih mudah dan aman.&lt;/p&gt;
&lt;p&gt;Ekosistem yang Berkembang Pesat&lt;/p&gt;
&lt;p&gt;Meskipun Rust masih relatif muda, ekosistemnya telah berkembang pesat. Cargo — package manager dan build system bawaan Rust — membuat manajemen dependensi dan kompilasi proyek menjadi sangat mudah. Crates.io, repositori paket Rust, memiliki ribuan library open-source yang mencakup berbagai kebutuhan pengembangan.&lt;/p&gt;
&lt;p&gt;Kapan Menggunakan Rust?&lt;/p&gt;
&lt;p&gt;Rust adalah pilihan ideal untuk pengembangan sistem operasi dan embedded systems, aplikasi web server dengan performa tinggi, game engine dan real-time systems, blockchain dan cryptocurrency platforms, alat command-line (CLI) yang cepat dan andal, serta WebAssembly untuk performa di browser.&lt;/p&gt;
&lt;p&gt;Perusahaan-perusahaan besar seperti Google, Microsoft, Amazon, Meta, dan Discord telah mengadopsi Rust untuk berbagai komponen kritis sistem mereka.&lt;/p&gt;
&lt;p&gt;Kesimpulan&lt;/p&gt;
&lt;p&gt;Rust menawarkan solusi yang elegan untuk masalah klasik dalam pengembangan perangkat lunak sistem. Dengan kombinasi keamanan memori yang terjamin pada waktu kompilasi, performa setara bahasa native, dan ekosistem yang modern, Rust menjadi pilihan yang menarik baik untuk proyek baru maupun untuk memigrasikan komponen kritis dari sistem yang sudah ada.&lt;/p&gt;
&lt;p&gt;Bagi pengembang yang baru memulai, kurva belajar Rust memang terkenal cukup curam — terutama karena konsep ownership dan borrowing. Namun, investasi waktu untuk memahami konsep-konsep tersebut akan membuahkan hasil berupa kode yang lebih aman, lebih cepat, dan lebih mudah dipelihara.&lt;/p&gt;</content:encoded><category>category:pengetahuan</category><category>tag:rust</category></item><item><title>Tutorial Lengkap Armbian - Install dan Konfigurasi Linux untuk ARM Board</title><link>https://webku-7lt.pages.dev/ja/post/tutorial-armbian</link><guid isPermaLink="false">ja:tutorial-armbian</guid><description>Panduan lengkap install Armbian di board ARM seperti Orange Pi, Banana Pi, dan Raspberry Pi. Mulai dari flashing SD card hingga konfigurasi awal sistem.</description><pubDate>Mon, 15 Jun 2026 17:00:00 GMT</pubDate><content:encoded/><category>category:armbian</category><category>tag:armbian</category><category>tag:tutorial</category></item><item><title>Tips linux Untuk Pemula</title><link>https://webku-7lt.pages.dev/ja/post/tips-linux-untuk-pemula</link><guid isPermaLink="false">ja:tips-linux-untuk-pemula</guid><description>Kumpulan tips Linux yang berguna untuk pemula</description><pubDate>Mon, 15 Jun 2026 07:26:00 GMT</pubDate><content:encoded>&lt;p&gt;markdown&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# Tips Linux untuk Pemula&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Berikut adalah beberapa tips yang berguna untuk kamu yang baru mulai menggunakan Linux.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## 1. Kenali Terminal&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Terminal adalah senjata utama di Linux. Beberapa perintah dasar:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```bash&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ls - list file&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cd - ganti direktori&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cp - copy file&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;mv - pindah/renama file&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;rm - hapus file&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;2. Update System Rutin&lt;/strong&gt;&lt;a href=&quot;#2-update-system-rutin&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;bash&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;3. Install Software&lt;/strong&gt;&lt;a href=&quot;#3-install-software&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;bash&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo apt install nama-aplikasi&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Kesimpulan&lt;/strong&gt;&lt;a href=&quot;#kesimpulan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Linux memang butuh waktu untuk dipelajari, tapi setelah terbiasa kamu akan merasa lebih bebas dan fleksibel.&lt;/p&gt;</content:encoded><category>category:tutorial</category><category>tag:linux</category><category>tag:tips</category></item><item><title>Panduan Astro Untuk Pemula</title><link>https://webku-7lt.pages.dev/ja/post/panduan-astro-untuk-pemula</link><guid isPermaLink="false">ja:panduan-astro-untuk-pemula</guid><description>Panduan lengkap belajar Astro framework untuk pemula</description><pubDate>Sun, 14 Jun 2026 18:54:00 GMT</pubDate><content:encoded>&lt;p&gt;markdown&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;markdown&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# Panduan Astro untuk Pemula&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Astro adalah framework web all-in-one untuk membangun website yang cepat.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## Apa itu Astro?&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Astro memungkinkan kamu membangun website dengan:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- **Zero JavaScript by default** — tidak ada JS yang dikirim ke browser&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- **Island Architecture** — hydrate hanya komponen yang interaktif&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- **Support semua framework** — React, Vue, Svelte, dll&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## Cara Install&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```bash&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;npm create astro@latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Struktur Project&lt;/strong&gt;&lt;a href=&quot;#struktur-project&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;text&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;text&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;src/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── components/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── content/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── layouts/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;└── pages/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Kesimpulan&lt;/strong&gt;&lt;a href=&quot;#kesimpulan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Astro sangat cocok untuk website yang mengutamakan performa dan SEO.&lt;/p&gt;</content:encoded><category>category:tutorial</category><category>tag:astro</category><category>tag:tutorial</category></item></channel></rss>