Langsung ke konten
AFM Studio
  • Halaman

    AFM Studio
  • Karya
  • Lab
  • Tentang
  • CV
  • Kontak
  • Proyek

    AksaraPerpustakaan pengetahuan Otorita IKN yang bisa dicari, dengan server memeriksa akses setiap pembaca di tiga tingkat
  • Daily TaqwaSistem presensi salat anti-manipulasi untuk ~2.000 pegawai OIKN di Masjid Negara IKN
  • Lantara v2Mesin perizinan Otorita IKN tempat administrator menambah jenis izin baru dari layar, tanpa developer
  • eKiosk IKNDua ruang kendali untuk Nusantara: konten kios dan pelacakan bus live dengan estimasi kedatangan yang menilai dirinya sendiri
  • E-Monev IKNPlatform pemantauan pembangunan Nusantara selama 23 tahun, melacak progres triwulan setiap unit terhadap 24 KPI
  • JDIH OIKNPortal dokumen hukum publik OIKN, dengan alur penerbitan terkendali dan ringkasan AI yang tidak pernah keluar dari server
  • Jejak PenanamanAplikasi absen acara penanaman pohon IKN yang membuktikan peserta hadir di lokasi lewat selfie ber-geofence
  • Dashboard SAKTIPipeline malam dan dashboard yang menggantikan unduhan anggaran manual di keenam satker OIKN
  • DoseRxKalkulator dosis untuk 127 obat yang membulatkan dosis ke tablet dan sirup yang dijual apotek Indonesia
  • CubiqPelatih speedcubing dengan timer setara kompetisi dan solver buatan sendiri untuk 8 puzzle utama
  • ScimotionPerpustakaan sains interaktif berisi 86 artikel, masing-masing dijelaskan bersama animasi yang bisa dikendalikan pembaca
  • WA Daily Scrum BotBot WhatsApp yang menagih laporan standup tim 14 orang dan menandai tugas yang macet berhari-hari

↑ ↓ untuk berpindah · Enter untuk membuka · Esc untuk menutup

Myers Visualizer

Tayangan ulang interaktif tentang cara kerja git diff, termasuk alasan ia kadang salah menunjuk baris

Tangkapan layar
algoritma diff ditulis dari makalahnya
4
pada graf suntingan 300×300
59,9 fps
langkah pencarian kasus terburuk, tanpa macet
135.152
preset, masing-masing menunjukkan satu perilaku diff
8
Di halaman ini

Masalahnya

Developer menjalankan git diff hampir setiap hari kerja, tapi hanya sedikit yang tahu cara kerjanya. Diff hanya terlihat sebagai hasil akhir. Tidak ada yang menunjukkan bahwa hasil itu lahir dari pencarian jalur terpendek di sebuah kisi.

Bagian yang membingungkan juga tidak pernah dijelaskan. Semua orang pernah melihat diff menempelkan kurung kurawal penutup ke fungsi yang salah, atau menampilkan "tambah 2 baris" sebagai "hapus 5, tambah 7". Orang menganggapnya keanehan biasa. Penyebab sebenarnya: kumpulan suntingan terpendek biasanya tidak tunggal, dan aturan pemecah seri di algoritma memilih salah satunya tanpa peduli mana yang enak dibaca. Itu juga alasan git menyertakan algoritma diff lain, seperti patience.

Saya membuat Myers Visualizer untuk developer, untuk mahasiswa dan pengajar pencarian graf, dan untuk siapa pun yang membaca makalah Eugene Myers tahun 1986 dan ingin diagramnya bergerak.

Yang saya bangun

Mesin diff saya tulis langsung dari makalahnya

Saya mengimplementasikan empat algoritma diff sendiri: Myers greedy, Myers versi hemat memori (linear-space), patience, dan histogram. Tidak ada pustaka diff di proyek ini. Mesinnya menerima dua teks dan opsi, lalu mengembalikan daftar suntingan, rekaman lengkap pencariannya, dan statistik. Tidak ada jam atau unsur acak, jadi input yang sama selalu memberi hasil yang sama. Karena pencarian direkam sekali, mundur selangkah tidak memakan biaya apa pun.

Pemeriksanya saya tulis sebelum algoritmanya

Sebelum kode Myers ditulis, saya menulis dua pemeriksa yang berdiri sendiri. Yang pertama menerapkan daftar suntingan ke teks pertama dan memastikan hasilnya sama dengan teks kedua. Yang kedua adalah pencarian brute-force yang lambat untuk menemukan jumlah suntingan minimum yang sebenarnya. Setiap algoritma, di setiap input, harus lolos keduanya. Tesnya tidak pernah menuntut dua algoritma menghasilkan suntingan yang sama, cukup jumlahnya yang sama, karena beberapa jawaban minimal bisa sama-sama benar.

Kisi digambar di canvas, pencarian jalan di latar

Graf suntingan adalah produknya, jadi uji gambar kisi 300×300 saya kerjakan sebelum kode algoritma apa pun. Kisi digambar di canvas, sehingga halaman tidak membuat satu elemen per sel. Setiap frame hanya menggambar ulang garis depan pencarian. Pencariannya sendiri jalan di worker latar dengan batas langkah, jadi preset kasus terburuk pun tidak bisa membekukan halaman.

Klaim setiap preset diuji

Dua klaim preset pertama saya ternyata salah saat saya periksa. Aturan pemecah seri di implementasi saya tidak menempelkan kurung ke fungsi yang salah pada input pertama yang saya coba. Keduanya saya ganti dengan input yang memang menunjukkan fenomenanya, dan sekarang kedelapan preset membuktikan klaimnya lewat tes. Aturan itu juga saya tulis di panduan kerja repo.

Situsnya saya susun ulang untuk orang yang belum pernah menjalankan git diff

Menjelang akhir, saya menyusun ulang halaman depan untuk pendatang baru. Halaman dibuka dengan pertanyaan, lalu contoh tanpa istilah teknis, gagasannya dalam tiga langkah, dan alasan diff bisa salah menunjuk baris. Notasi dan glosarium baru muncul di akhir. Kisinya juga diberi label sumbu, karena pendatang baru yang salah menebaknya akan membaca seluruh gambar secara terbalik.

Hasilnya

Myers Visualizer sudah live, publik, dan open source. Situs ini bisa dipasang seperti aplikasi dan tetap jalan offline setelah kunjungan pertama. Situs menampilkan graf suntingan saat terisi, memori kerja algoritma di sebelahnya, berapa banyak jawaban yang sama-sama minimal, dan perbandingan keempat algoritma. Di contoh situsnya sendiri, keempatnya butuh 5 suntingan, dan patience tetap memangkas jumlah blok perubahan menjadi separuh.

Kisi 300×300 berjalan di 59,9 frame per detik. Di batas input, kasus terburuk butuh 135.152 langkah pencarian dan halaman tetap responsif. Tersedia dalam bahasa Inggris dan Indonesia. Saya membangunnya dalam dua hari pada Agustus 2026.

Di balik layarDetail teknis untuk engineer
  • Mesinnya fungsi murni, (a, b, options) → { script, trace, stats }, tanpa React, DOM, jam, unsur acak, atau state tingkat modul. Teks diubah dulu menjadi id integer, sehingga granularitas baris atau karakter dan penanganan spasi menjadi pengaturan yang eksplisit.
  • lib/diff/ (~1.750 baris) berisi Myers greedy dengan perekaman V dan backtrack, varian dua arah linear-space dengan middle snake, patience, dan histogram. Tanpa pustaka diff.
  • apply.ts (script + A → B) tidak berbagi kode dengan pencarian mana pun; brute.ts adalah BFS di graf suntingan untuk D minimal yang sebenarnya. Keduanya ditulis sebelum myers.ts. Tes mengecek kesamaan D dan kebenaran apply, tidak pernah kesamaan script.
  • Array V diindeks dengan k = x − y, yang bisa negatif. Offset-nya ditaruh di balik satu accessor bernama dan tidak pernah ditulis langsung, karena off-by-one di situ tetap terlihat masuk akal pada input simetris.
  • Render Canvas 2D ditulis sendiri. Kerja per frame O(frontier), bukan O(N·M), dijaga oleh unit test.
  • pnpm bench:render melakukan build, menyajikan situs di basePath produksi, dan menjalankan headless Chrome: 220 frame, rata-rata gambar 0,13 ms, p95 0,30 ms, median frame 16,70 ms (59,9 fps). Tidak dijalankan di CI karena pengukuran waktu di runner bersama sering meleset.
  • jsdom tidak punya Worker dan canvas-nya cuma tiruan, jadi smoke test Puppeteer membaca piksel dari hasil build dan memastikan chunk worker dimuat. Tes ini langsung menemukan bug: hash URL hanya dibaca saat mount. URL live lolos smoke suite 15/15.
  • Kasus terburuk di batas input: D = 600, 135.152 langkah pencarian, 362.404 sel V. Mode linear-space menampilkan penghitung memori langsung untuk O(D²) vs O(N+M). Di contoh perbandingan, keempat algoritma sepakat di D = 5.
  • 8 preset: minimal-edit, pure-insert, pure-delete, transposition, brace-misattribution, patience-wins, worst-case, char-level, masing-masing diuji di tests/presets/.
  • Perbaikan static export: app/manifest.ts mengabaikan basePath (404 diam-diam, prompt install tidak muncul), jadi manifest dijadikan file statis yang dikunci tes. metadataBase sudah membawa basePath, sehingga gambar OG yang root-relative mendapatkannya dua kali.
  • Proyek ini awalnya berbahasa Indonesia sebagai default, lalu diganti nama dan default-nya dipindah ke bahasa Inggris. Istilah algoritma tetap bahasa Inggris di kedua bahasa.
  • Tiga dependensi runtime (Next.js 14.2, React, react-dom). JS first-load bersama 87,4 KB gzip, 107 KB di halaman graf, dari anggaran 250 KB.
  • Di luar cakupan: unggah file, diff direktori, three-way merge, diff AST, akun. Situs menyebut bahwa git memakai heuristik tambahan dan tidak mengklaim hasilnya identik byte demi byte dengan git diff.
  • ~8.900 baris TypeScript, 152 tes di 24 file, 25 commit dari 4 sampai 5 Agustus 2026.

Tangkapan layar

Beranda
Edit Graph
What it search
Algorithm Comparison
Presets

Sedang merekrut, atau membangun hal serupa?

Saya terbuka untuk posisi full-time dan proyek freelance tertentu.