Cara Kerja QR Code: Kenapa Titik-Titik “Acak” Itu Menyimpan Data

Hampir tiap hari kita memindai QR code — bayar di warung, buka menu restoran, sambungkan Wi-Fi, sampai login WhatsApp Web. Bentuknya seperti kumpulan titik hitam-putih yang tampak acak, tapi setiap kali discan, datanya keluar utuh: URL, teks, atau nomor rekening. Kok bisa? Ternyata titik-titik itu tidak acak sama sekali. Ini catatan belajar saya tentang cara kerja QR code dari sisi teknisnya.

Awal mula: dari barcode garis ke kotak-kotak

QR code (kependekan dari Quick Response code) ditemukan tahun 1994 oleh Masahiro Hara di perusahaan Jepang Denso Wave (anak perusahaan Toyota), awalnya untuk melacak suku cadang mobil di pabrik. Berbeda dari barcode 1D yang cuma menyimpan data secara horizontal, QR code menyimpan data dalam dua arah (matriks), sehingga kapasitasnya jauh lebih besar dan bisa dibaca lebih cepat — makanya dinamai “quick response”.

Menariknya, Denso Wave memilih tidak mengeksploitasi hak patennya, sehingga QR code bebas dipakai siapa saja. Standarnya kemudian dibakukan dalam ISO/IEC 18004. Itulah kenapa QR bisa muncul di struk, kartu nama, iklan, sampai kuburan.

Titik “acak” itu sebenarnya bit

Setiap titik kecil di QR code disebut modul, dan satu modul menyimpan satu bit: modul hitam = 1, modul putih = 0. Scanner tinggal membaca deretan bit itu dan menerjemahkannya menjadi teks. Kalau hanya itu, kenapa bentuknya tidak seperti barcode sederhana saja?

Karena QR code punya aturan ketat: ada pola fungsi (function patterns) yang wajib ada supaya kamera bisa menemukan, mengorientasikan, dan mengukur kode dengan cepat. Sisa area yang kosong baru diisi data dengan pola zig-zag tertentu, lalu dimasking supaya tidak muncul pola yang menyesatkan pembaca. Hasil akhirnya memang terlihat acak — tapi itu hasil rekayasa, bukan kebetulan.

Anatomi QR code

Gambar di bawah adalah QR code versi 6 (41×41 modul) yang menyimpan URL blog ini, dengan bagian-bagiannya diwarnai:

Anatomi QR code: finder pattern, separator, timing, alignment, dark module, area data
Anatomi QR code versi 6 (41×41 modul)
  • 3 pola finder (merah): kotak di tiga sudut dengan rasio gelap-terang 1:1:3:1:1. Pola ini sangat jarang muncul di area lain, jadi scanner mudah menemukannya dan langsung tahu orientasi kode — itulah kenapa QR bisa dibaca dari arah mana pun (360°).
  • Separator (oranye): batas putih satu modul di sekeliling finder, supaya pola finder tidak tertukar dengan data di dekatnya.
  • Pola timing (biru): garis putus-putus antara finder yang memberi tahu scanner ukuran grid (berapa modul per baris/kolom).
  • Pola alignment (hijau): kotak kecil pembantu agar scanner tetap bisa membaca saat kode miring atau terdistorsi (ada di versi 2 ke atas).
  • Dark module (ungu): satu modul hitam yang selalu ada, bagian dari area format info.
  • Area data (abu-abu): bit data + koreksi kesalahan + format info (mode, level koreksi, pola mask).

Pola finder: rasio 1:1:3:1:1

Tiga kotak sudut (finder) itu berukuran 7×7 modul. Kalau diiris tepat di tengah, baris tengahnya membentuk pola gelap-terang dengan perbandingan 1:1:3:1:1 — satu hitam, satu putih, tiga hitam, satu putih, satu hitam. Scanner memindai piksel, mencari rasio persis ini, lalu langsung tahu: ini QR code, di mana sudut-sudutnya, dan arah yang benar.

Pola finder QR code 7x7 dengan rasio gelap-terang 1:1:3:1:1
Pola finder 7×7: baris tengah = 1 hitam · 1 putih · 3 hitam · 1 putih · 1 hitam

Proses pembuatan: dari teks menjadi titik-titik

Kalau kita menulis QR code secara manual (atau membaca kode programnya), alurnya kira-kira begini:

Diagram alur pembuatan QR code (encode) dan pembacaan (decode)
Dari teks ke QR code (encode) dan kembali ke teks (decode)

Encoder (pembuat):

  1. Analisis data — pilih mode paling efisien: numerik (0-9), alfanumerik (A-Z, 0-9, simbol), byte (teks biasa/UTF-8), atau Kanji. Tulis header berisi mode + panjang data.
  2. Susun bit stream — teks diubah menjadi deretan 0 dan 1.
  3. Tambahkan koreksi kesalahan — deretan bit diolah dengan algoritma Reed-Solomon untuk menghasilkan kata kode cadangan.
  4. Isi matriks — bit ditaruh ke dalam grid dengan pola zig-zag (naik-turun), melewati area pola fungsi.
  5. Masking — coba 8 pola mask, hitung skor penalti tiap pola (ada 4 aturan penilaian), lalu pakai pola dengan skor terendah.
  6. Tulis format & version info — QR code siap dicetak.

Kenapa harus masking? Karena kalau area data dibiarkan apa adanya, bisa muncul blok hitam besar atau pola yang mirip finder — dan itu akan membingungkan scanner. Masking “mengacak” area data secara teratur (misal: balik warna tiap baris genap, atau tiap 3 kolom) sehingga hasilnya seimbang. Scanner membaliknya lagi pakai info pola mask yang disimpan di format info.

Proses pembacaan: dari gambar kembali ke teks

  1. Kamera menangkap gambar QR.
  2. Scanner mencari 3 pola finder (rasio 1:1:3:1:1) untuk menentukan posisi dan orientasi, lalu memperbaiki perspektif kalau kodenya miring.
  3. Menentukan titik tengah tiap modul dan mengubahnya menjadi bit (gelap = 1, terang = 0).
  4. Membaca format info untuk mengetahui mode, level koreksi, dan pola mask → membalik proses masking.
  5. Memisahkan bit data dan bit koreksi, lalu Reed-Solomon memperbaiki bit yang salah karena kotor, sobek, atau tertutup sebagian.
  6. Menerjemahkan bit menjadi teks asli — selesai, dalam hitungan milidetik.

Versi, kapasitas, dan level koreksi

QR code punya 40 versi ukuran: versi 1 berukuran 21×21 modul, setiap naik versi bertambah 4 modul per sisi, sampai versi 40 dengan 177×177 modul. Makin besar versinya, makin banyak data yang bisa ditampung. Kapasitas maksimum (pada level koreksi L) kira-kira:

ModeKapasitas maksimum (versi 40, level L)
Numerik (0-9)7.089 digit
Alfanumerik (A-Z, 0-9, simbol)4.296 karakter
Byte (teks biasa, UTF-8)2.953 byte
Kanji1.817 karakter

Selain versi, ada 4 level koreksi kesalahan yang bisa dipilih. Makin tinggi levelnya, makin tahan kode terhadap kerusakan, tapi kapasitas datanya mengecil:

LevelModul yang bisa rusak/tutupContoh pemakaian
L (Low)± 7%Data banyak, ruang cetak sempit
M (Medium)± 15%Standar umum
Q (Quartile)± 25%Permukaan kasar, sering terlipat
H (High)± 30%Kode diberi logo di tengah

Itulah kenapa QR yang sebagian tertutup logo atau sobek masih bisa dibaca — yang rusak ditambal oleh data cadangan Reed-Solomon. Coba saja: tempel stiker kecil di tengah QR di bawah ini, biasanya tetap ke-scan.

Contoh QR code yang bisa dipindai mengarah ke rudyhartadi.web.id
Coba scan: QR ini menyimpan URL rudyhartadi.web.id

Kesimpulan

QR code terlihat seperti titik acak, padahal semuanya terstruktur: pola fungsi untuk navigasi, bit data yang diatur zig-zag, cadangan Reed-Solomon untuk ketahanan, dan masking untuk keterbacaan. Yang membuatnya “ajaib” bukanlah keacakan, melainkan redundansi dan aturan yang ketat — di balik setiap scan, ada algoritma yang bekerja dalam hitungan milidetik.

Sumber

Belajar Dzikir Pagi: Amalan Ringan yang Menghidupkan Hati

Hari ini saya belajar tentang dzikir pagi. Jujur, selama ini saya mengira dzikir pagi itu cuma rutinitas — baca beberapa wirid lalu selesai, tanpa tahu apa makna di baliknya. Ternyata ilmunya dalam sekali. Catatan ini saya rangkum dari kajian Ustadz Abdullah Zaen, Lc., MA dalam serial Fiqih Doa dan Dzikir, plus artikel dari Rumaysho.com.

Kapan Waktunya dan Apa Keutamaannya

Dzikir pagi paling utama dibaca setelah masuk waktu Subuh hingga matahari terbit. Namun boleh juga dibaca sampai matahari bergeser ke barat (mendekati waktu Zhuhur). Saya baru paham bahwa dzikir pagi tidak harus lama — yang penting istiqamah. Ibnu Qayyim dalam kitab Al-Wabilush Shoyyib menyebut dzikir punya lebih dari seratus faedah: mengusir setan, mendatangkan keridaan Allah, menghilangkan kekhawatiran dan kesedihan, menguatkan hati dan badan, bahkan mencerahkan wajah dan hati.

Rasulullah shallallahu ‘alaihi wasallam bersabda: “Siapa yang mengucapkan ‘Subhanallahi wa bihamdihi’ seratus kali dalam sehari, maka kesalahan-kesalahannya dihapuskan walaupun sebanyak buih di lautan” (HR. Bukhari dan Muslim). Subhanallah, amalan yang ringan di lisan ternyata begitu besar di sisi Allah.

Satu Wirid yang Kaya Makna

Dari kajian Ustadz Abdullah Zaen, saya belajar satu wirid pagi yang diajarkan Rasulullah: “Ashbahna wa ashbahal mulku lillah, walhamdulillah, laa ilaaha illallah wahdahu laa syarika lah…” — “Kami telah memasuki waktu pagi dan kekuasaan hanya milik Allah. Segala puji bagi Allah. Tidak ada tuhan yang berhak disembah kecuali Allah, tiada sekutu bagi-Nya…” (HR. Muslim, dari Ibnu Mas’ud).

Yang menarik, wirid ini mengajarkan etika berdoa: awali dengan pujian kepada Allah, baru sampaikan permohonan. Pujian itu berisi pengakuan atas nikmat-Nya (salah satunya nikmat umur — betapa banyak orang yang tidak sempat menikmati pagi hari ini) dan pengakuan atas keagungan-Nya. Setelah itu barulah kita memohon dua hal: kebaikan secara umum (rizki halal, kesehatan, keharmonisan keluarga, semangat beribadah) dan perlindungan dari keburukan, baik di dunia (dicontohkan dengan kemalasan dan keburukan masa tua) maupun di akhirat (azab neraka dan azab kubur).

Ustadz Abdullah Zaen juga mengingatkan: kemalasan itu berbeda dengan ketidakmampuan. Orang yang malas sebenarnya mampu, tapi enggan melaksanakan. Dzikir pagi seolah menjadi pengingat harian untuk meminta perlindungan dari sifat malas sebelum kita memulai aktivitas.

Merenungkan semua ini, saya makin paham kenapa para ulama menyebut dzikir sebagai makanan hati. Rencana saya: mulai membiasakan dzikir pagi setelah Subuh, pelan-pelan, sambil meresapi artinya — bukan sekadar membaca. Semoga catatan kecil ini bermanfaat untuk kita semua.

9Router: AI Router Gratis untuk Koding — Catatan Riset & Ulasan

Beberapa hari terakhir saya menelusuri tool yang sedang ramai dibicarakan developer: 9Router. Buat yang sering mentok rate limit di tengah sesi koding pakai Claude Code, Codex, atau Cursor, tool ini menarik banget untuk dicoba. Catatan ini adalah rangkuman riset saya: apa itu, cara kerjanya, fitur unggulan, biaya, sampai catatan keamanannya.

Apa itu 9Router?

9Router adalah AI router open-source (lisensi MIT) yang duduk di antara tool coding AI dan penyedia model LLM. Tool coding seperti Claude Code, Codex, Cursor, Cline, GitHub Copilot, Antigravity, sampai OpenClaw cukup diarahkan ke satu endpoint OpenAI-compatible di localhost:20128/v1, dan 9Router yang meneruskan permintaan ke provider pilihan kita — sekaligus menerjemahkan format permintaan (OpenAI ↔ Claude ↔ Gemini ↔ Vertex, dst.) supaya tool apa pun bisa memakai model apa pun.

Proyek ini lahir Januari 2026 dan tumbuhnya luar biasa cepat: per 6 Agustus 2026 sudah sekitar 24,7 ribu bintang GitHub, 4,3 ribu fork, dan masih sangat aktif dikembangkan — rilis terbaru v0.5.35 (16 Juli 2026), push terakhir 5 Agustus 2026. Slogannya singkat: never stop coding.

Kenapa orang pakai 9Router?

Masalah umum yang dijawab tool ini: kuota langganan terbuang percuma, rate limit di tengah kerja, token terbakar oleh output tool (git diff, grep, ls, log), dan biaya API yang mahal. Fitur utamanya:

  • Smart 3-Tier Fallback — rute otomatis Subscription → Cheap → Free. Begitu kuota habis atau error, langsung pindah tier tanpa jeda.
  • RTK Token Saver — kompresi output tool_result sebelum dikirim ke LLM, hemat 20–40% token input per request, tanpa kehilangan konteks.
  • Caveman Mode & Ponytail — memaksa LLM menjawab ringkas (hemat sampai 65% token output) atau menulis kode minimal ala “lazy senior dev” (YAGNI).
  • Multi-account round-robin, auto-refresh token OAuth, quota tracking real-time, request logging, cloud sync, dan usage analytics.

Provider dan biaya

Poin penting: software 9Router gratis selamanya. Yang kita bayar hanyalah provider (kalau memakai yang berbayar). Angka “cost” di dashboard hanya estimasi penanda penghematan — bukan tagihan.

  • Gratis: Kiro AI (~50 kredit/bulan, plus 500 kredit trial untuk akun baru), OpenCode Free (tanpa auth), Vertex AI ($300 kredit akun GCP baru, via endpoint Vertex AI Studio).
  • Murah: GLM ($0,6/1 juta token), MiniMax M2.7 ($0,2/1 juta token), Kimi K2.5 ($9/bulan flat).
  • Langganan: Claude Code Pro/Max ($20–200/bulan), Codex, GitHub Copilot, Cursor.

Kombinasi RTK + Kiro + OpenCode Free bisa membuat biaya $0/bulan sambil tetap hemat token. Tapi ingat, free tier provider bisa berubah sewaktu-waktu — contohnya iFlow, Qwen Code, dan Gemini CLI free tier sudah dihentikan sepanjang tahun 2026.

Cara pasang

  1. npm install -g 9router, lalu jalankan 9router.
  2. Dashboard terbuka di http://localhost:20128.
  3. Hubungkan provider — bisa mulai dari yang gratis (Kiro AI atau OpenCode Free).
  4. Arahkan tool coding ke endpoint http://localhost:20128/v1 + API key dari dashboard.

Selain lokal, bisa di-deploy di VPS, Docker, Cloudflare Workers, bahkan Hugging Face Spaces.

Catatan penting: keamanan

Ini bagian yang membuat saya agak hati-hati. Repo ini punya 19 security advisories (Mei–Juli 2026), termasuk beberapa yang berlabel critical: unauthenticated remote code execution via plugin MCP, pencurian kredensial + pengambilalihan database, hardcoded JWT secret, auth bypass lewat spoofing header (Host, X-Forwarded-For, X-9r-Real-Ip), dan SSRF. Kabar baiknya, tim pengembang merespons cepat dengan rilis beruntun. Saran saya:

  • Selalu pakai versi terbaru (v0.5.35+); jangan pakai versi lama untuk instance yang terhubung internet.
  • Jangan expose dashboard/API ke internet publik tanpa proteksi — untuk akses remote pakai Cloudflare Tunnel atau VPN.
  • Hati-hati paket tiruan: nama npm resmi adalah 9router (tanpa “s”). Paket 9routers sempat dikaitkan dengan laporan kerentanan di database pihak ketiga.

Alternatif

  • LiteLLM — 100+ provider, fokus enterprise, tanpa kompresi token bawaan.
  • OpenRouter — cloud-based, praktis, tapi tanpa fitur hemat token lokal.
  • OmniRoute — 4-tier fallback, 36+ provider.

Dibanding ketiganya, 9Router unggul di sisi local-first, gratis, dan kedalaman fitur penghemat token.

Kesimpulan

9Router menarik untuk developer yang ingin memaksimalkan langganan yang sudah ada atau menekan biaya API sampai nol. Tapi karena riwayat keamanannya sibuk, pakai dengan bijak: update rutin, jangan expose ke publik, dan ingat bahwa memakai langganan IDE untuk memanggil backend lain lewat router bisa melanggar ToS masing-masing tool — 9Router sendiri mengingatkan “mind each tool’s policy”. Untuk catatan pribadi saya: layak dicoba di lingkungan lokal/Docker, tapi belum saya rekomendasikan sebagai gerbang utama menuju production.

Sumber