Blog
Catatan teknis seputar web development, DevOps, dan integrasi AI.
173 artikel
- 02.28tooling
File .rejected: Keputusan Manusia Kalahkan Status Otomatis
Registri topik riset saya cuma punya status turunan, sampai file .rejected ngasih keputusan manusia tempat di rantai prioritas.
TL;DR: Jadi gini, registri topik riset nggak punya tempat buat keputusan tolak, jadi topik yang udah ditolak manual tetep nongol mulu. Solusinya gampang: bikin file .rejected yang ditulis manual, tool cuma boleh baca dan nampilin alasannya. Ini sejalan sama pola rustup, pyenv, nvm, dan git: mesin boleh usul, tapi keputusan manusia harus dihormati dan kelihatan.
#python#automation#tooling - 22.37devops
Menutup auto-deploy Vercel untuk branch stag
Tiap push ke staging bikin deployment preview percuma. Satu blok git.deploymentEnabled di vercel.json cukup buat menutupnya.
TL;DR: Vercel defaultnya deploy semua branch yang di-push, jadi tiap push ke stag bikin preview deployment yang nggak dibutuhin. Solusinya cuma file vercel.json delapan baris pakai git.deploymentEnabled buat matiin deploy stag. Lebih milih ini daripada Ignored Build Step soal script exit codenya gampang kebalik dan bisa bikin deploy mati diam-diam.
#vercel#deployment#devops - 22.21devops
Pindah ke docker compose v2: perbaikan yang telat tiga tahun
Skrip dev saya masih manggil docker-compose di sebelas tempat. Compose v1 ternyata udah EOL sejak Juni 2023, yang jalan di laptop cuma symlink ke v2.
TL;DR: Skrip dev kantor masih manggil docker-compose gaya lama, padahal Compose v1 udah nggak didukung sejak 2023. Laptop aman cuma karena symlink kompatibilitas Docker Desktop, tapi di CI bersih perintah itu bisa langsung mati. Fix-nya gampang banget: ganti strip jadi spasi jadi docker compose, selesai satu commit.
#docker#compose#devops - 20.29devops
Pindah Deploy ke Vercel: Kuncinya di Luar Kode
Diff-nya cuma dokumentasi, tapi migrasi deploy Cloudflare Workers ke Vercel tetap terjadi. Kabelnya ada di dashboard Vercel dan settings GitHub, bukan di dalam repo.
TL;DR: Gara-gara satu baris di CLAUDE.md, penulis sadar migrasi dari Cloudflare Workers ke Vercel nggak ninggalin jejak di repo, karena settingnya ada di dashboard, bukan Git. Production branch di Vercel dipilih pas impor dan bisa diatur lewat Branch Tracking, jadi default branch GitHub beda hal. Alur Git tetap sama, tapi env vars mesti didaftarkan ulang dan rollback modelnya tunjuk deployment.
#vercel#cloudflare#git - 17.30frontend
Dark Peta MapLibre ala Google Maps lewat Runtime Override
Fiord bikin peta gelap tapi datar. Saya mutasi style JSON-nya langsung di runtime: brightness ladder per layer, label terang ber-halo, plus guard anti-flash.
TL;DR: Fiord dark mode bikin jalan semua abu-abu sama, susah dibaca. Akhirnya fetch JSON Fiord, ubah paint 28 layer bikin tingkatan kecerahan jalan plus label pake halo gelap biar kelihatan kaya Google Maps. Pake cache, show peta dulu baru upgrade style, plus guard biar toggle cepat nggak bikin peta acak-acakan.
#maplibre#openfreemap#dark-mode - 16.45frontend
Peta Mendadak Penuh Watermark: Pindah ke MapLibre dan OpenFreeMap
Basemap CARTO tiba-tiba wajib API key dan peta proyek saya penuh watermark. Ini cerita migrasi tiga komponen Leaflet ke MapLibre GL dengan tile OpenFreeMap.
TL;DR: Basemap CARTO tiba-tiba wajib API key, jadi semua tile peta ketutup watermark abu-abu. Daripada ngurusin kuota, saya pindah ke OpenFreeMap yang gratis tanpa key dan migrasi semua komponen Leaflet ke MapLibre GL. Style dark bawaannya kontrasnya hampir nol, akhirnya diganti fiord biar peta kebaca lagi.
#maplibre#leaflet#openstreetmap - 12.19backend
Field Turunan Saya Basi Lagi, Tiga Hari Setelah Di-Backfill
Commit backfill next_review basi lagi tiga hari kemudian. Solusinya: field turunan dihitung saat dibaca, nilai manual tetap dipertahankan.
TL;DR: Gue ngabisin waktu backfill manual field next_review, eh besoknya datanya basi cuma gara-gara satu berkas baru. Ternyata itu field turunan yang bisa dihitung sendiri dari last_updated plus 90 hari, jadi mending derive pas dibaca, gak perlu disimpen. SQLite sama PostgreSQL aja udah setuju lewat generated column dan view; nyimpen cuma worth it kalau ada override manual atau bacaannya berat banget.
#python#sqlite#postgresql - 11.29ai
Blind Spot Gate Duplikat: Cakupan Vektor dan Batas 0,50
Gate duplikat berbasis cosine similarity cuma sekuat cakupan indeks vektornya. Pelajaran dari blind spot 32 artikel dan angka 0,50 yang dikalibrasi sendiri.
TL;DR: Gate cek duplikat kelihatan normal padahal 32 artikel nggak ke-embed, jadi skornya ngableng tanpa peringatan. Fix-nya backfill indeks plus self-check: judul artikel sendiri harus balikin slug-nya sendiri. Threshold 0,50 juga bukan angka sakral; ukur dulu distribusi skor korpus sendiri, baru taruh garis potong.
#embedding#python#automation - 10.18devops
Task Ansible yang gagal karena direktori conf.d tidak ada
Playbook mitigation berhenti di server kesembilan: journald.conf.d ternyata tidak pernah ada. Satu task file state=directory menutup asumsi itu.
TL;DR: Playbook gagal di server kesembilan karena folder /etc/systemd/journald.conf.d nggak ada; delapan server lain kebetulan punya, jadi lolos terus. Fix-nya simpel banget: tambah satu task file state=directory sebelum task salin, beres. Hasilnya journal turun dari 720M ke 288M, aman di bawah cap 300M.
#ansible#systemd#journald