Jalur Baca
Seri
Rute pilihan lewat tulisan-tulisan yang saling nyambung. Mulai dari sebuah seri kalau kamu mau konteks, bukan arsip urut tanggal terbaru.
Kafka vs Redis Streams
Bikin stock ticker yang sama dua kali di broker beneran: partition, consumer group, delivery semantics, co-partitioning, replikasi, stream processing, dan benchmark yang jujur.
Kafka atau Redis Streams: Gimana Cara Memilihnya
Memilih antara Kafka dan Redis Streams dengan mengecek kebutuhan ordering, replay, recovery, kapasitas, dan operasional.
Benchmark Kafka vs Redis Streams: Throughput dan Latency
Tes Kafka dan Redis Streams saya memisahkan throughput dari latency dan menjelaskan dengan gamblang batasan dari sebuah benchmark lokal.
Membangun Live Market Dashboard dengan SSE dan Next.js
Menghubungkan ticker engine bersama ke dashboard Next.js lewat Server Sent Events.
Stateful Streams: Trigger Edge vs Level dan Window OHLC
Menyimpan harga sebelumnya untuk alert edge dan mengelompokkan tick ke dalam time window untuk candle OHLC.
Kafka ISR vs Redis Cluster: Replication dan Failover
Mematikan satu broker Kafka untuk menguji failover replica, lalu membandingkan perilakunya dengan sharding di Redis Cluster.
Menulis Custom Partition Assigner KafkaJS untuk Local Join
Memberikan partition yang cocok dari dua topic ke consumer KafkaJS yang sama, supaya consumer itu bisa join record-nya secara lokal.
Co-Partitioning: Key Sama, Partition Sama, di Kedua Topic
Key, jumlah partition, dan partitioner yang sama menyelaraskan record antar topic, sementara join lokal juga butuh consumer assignment yang cocok.
Redis Pub/Sub vs Streams: Ephemeral atau Durable
Membandingkan delivery Pub/Sub yang langsung dengan retention stream dan pembacaan belakangan, termasuk batasan persistence Redis.
Exactly-Once di Kafka: Idempotent Producer dan Transaction
Menguji idempotence di producer dan Kafka transaction, termasuk hasil mana yang bisa dilihat oleh committed reader.
Redis Streams: Message Nyangkut, XAUTOCLAIM, dan Dead Letter
Memeriksa entry Redis yang pending, mengambil alih delivery yang idle dengan XAUTOCLAIM, dan menangani kegagalan berulang dengan dead letter stream.
At-Least-Once di Kafka: Retry dan Dead Letter Queue
Menguji timing commit di Kafka, retry yang dibatasi, pemrosesan duplikat, dan dead letter queue.
Consumer Group Redis Streams: Competing Consumer dan PEL
Pakai XREADGROUP, Pending Entries List, dan XACK untuk membagikan entry stream Redis dan melacak pekerjaan yang belum selesai.
Kafka Consumer Group: Lag, Draining, dan Rebalancing
Mengamati partition assignment, consumer lag, dan rebalancing saat member bergabung ke sebuah Kafka consumer group.
Dasar-Dasar Redis Streams: XADD, Entry ID, dan MAXLEN
Pakai XADD, entry ID, stream key, dan MAXLEN untuk menulis, membaca, dan menyimpan data stream Redis.
Kafka Partition dan Key: Menjaga Simbol Tetap Berurutan
Menguji cara key di Kafka memilih partition dan menjaga urutan append setiap simbol.
Kafka vs Redis Streams: Bikin Stock Ticker Dua Kali
Saya bikin stock ticker pakai Kafka dan Redis Streams untuk membandingkan ordering, recovery, dan local join dengan broker sungguhan.
Crypto: age
Membongkar satu file age kecil lapis demi lapis: header passphrase, scrypt, ChaCha20-Poly1305, key pair, dan ngukur berapa lama serangan brute-force bakal makan waktu.
[Crypto: age] Berapa Lama Serangan Passphrase Berlangsung?
Hitung waktu serangan passphrase age, pahami asumsinya, dan lihat kenapa pemilihan acak lebih penting daripada panjang password aja.
[Crypto: age] Passphrase atau Key Pair
Bandingkan passphrase dengan key pair age, bikin key kamu sendiri, dan enkripsi satu file untuk dua recipient.
[Crypto: age] ChaCha20-Poly1305, Menyegel Isi File
Pelajari gimana age mengenkripsi isi file, apa yang dicek oleh authentication tag, dan apa yang terjadi kalau satu byte berubah.
[Crypto: age] scrypt, Dari Password ke Key
Pelajari gimana scrypt menurunkan wrapping key age, kenapa setiap percobaan memakai waktu dan memory, dan apa yang nggak bisa dicegah kalkulasi lambat.
[Crypto: age] Membaca Header
Membaca header file age satu per satu field-nya, dengan definisi sederhana untuk salt, file key terenkripsi, dan kode autentikasi.
[Crypto: age] Dari Password ke Ciphertext
Contoh pertama enkripsi file dengan age, dari teks yang bisa dibaca jadi file terenkripsi dan kembali lagi, dengan instruksi untuk setiap command.
Sistem Backend dan Arsitektur
Queue, caching, lock, API, dan tradeoff yang muncul waktu sistem nanggung traffic beneran.
Kafka atau Redis Streams: Gimana Cara Memilihnya
Memilih antara Kafka dan Redis Streams dengan mengecek kebutuhan ordering, replay, recovery, kapasitas, dan operasional.
Benchmark Kafka vs Redis Streams: Throughput dan Latency
Tes Kafka dan Redis Streams saya memisahkan throughput dari latency dan menjelaskan dengan gamblang batasan dari sebuah benchmark lokal.
Membangun Live Market Dashboard dengan SSE dan Next.js
Menghubungkan ticker engine bersama ke dashboard Next.js lewat Server Sent Events.
Stateful Streams: Trigger Edge vs Level dan Window OHLC
Menyimpan harga sebelumnya untuk alert edge dan mengelompokkan tick ke dalam time window untuk candle OHLC.
Kafka ISR vs Redis Cluster: Replication dan Failover
Mematikan satu broker Kafka untuk menguji failover replica, lalu membandingkan perilakunya dengan sharding di Redis Cluster.
Menulis Custom Partition Assigner KafkaJS untuk Local Join
Memberikan partition yang cocok dari dua topic ke consumer KafkaJS yang sama, supaya consumer itu bisa join record-nya secara lokal.
Co-Partitioning: Key Sama, Partition Sama, di Kedua Topic
Key, jumlah partition, dan partitioner yang sama menyelaraskan record antar topic, sementara join lokal juga butuh consumer assignment yang cocok.
Redis Pub/Sub vs Streams: Ephemeral atau Durable
Membandingkan delivery Pub/Sub yang langsung dengan retention stream dan pembacaan belakangan, termasuk batasan persistence Redis.
Exactly-Once di Kafka: Idempotent Producer dan Transaction
Menguji idempotence di producer dan Kafka transaction, termasuk hasil mana yang bisa dilihat oleh committed reader.
Redis Streams: Message Nyangkut, XAUTOCLAIM, dan Dead Letter
Memeriksa entry Redis yang pending, mengambil alih delivery yang idle dengan XAUTOCLAIM, dan menangani kegagalan berulang dengan dead letter stream.
At-Least-Once di Kafka: Retry dan Dead Letter Queue
Menguji timing commit di Kafka, retry yang dibatasi, pemrosesan duplikat, dan dead letter queue.
Consumer Group Redis Streams: Competing Consumer dan PEL
Pakai XREADGROUP, Pending Entries List, dan XACK untuk membagikan entry stream Redis dan melacak pekerjaan yang belum selesai.
Kafka Consumer Group: Lag, Draining, dan Rebalancing
Mengamati partition assignment, consumer lag, dan rebalancing saat member bergabung ke sebuah Kafka consumer group.
Dasar-Dasar Redis Streams: XADD, Entry ID, dan MAXLEN
Pakai XADD, entry ID, stream key, dan MAXLEN untuk menulis, membaca, dan menyimpan data stream Redis.
Kafka Partition dan Key: Menjaga Simbol Tetap Berurutan
Menguji cara key di Kafka memilih partition dan menjaga urutan append setiap simbol.
Kafka vs Redis Streams: Bikin Stock Ticker Dua Kali
Saya bikin stock ticker pakai Kafka dan Redis Streams untuk membandingkan ordering, recovery, dan local join dengan broker sungguhan.
Memilih Sistem Queue yang Tepat
Membandingkan job queue, message broker, event log, dan workflow engine berdasarkan kebutuhan delivery dan recovery-nya.
Strategi Caching: Dari Cache-Aside sampai Write-Behind
Membandingkan pattern cache dari read path, write path, perilaku saat gagal, dan risiko stale data.
PostgreSQL Advisory Lock: Fungsinya dan Kapan Memakainya
Pakai PostgreSQL advisory lock untuk mengoordinasikan pekerjaan aplikasi, dengan pilihan yang eksplisit soal kepemilikan dan masa hidup lock.
PgBoss vs BullMQ: Arsitektur Job Queue di Balik Layar
Membandingkan cara PgBoss dan BullMQ menyimpan, mengambil, menyelesaikan, dan memulihkan background job.
Desain API: Design-First vs Code-First
Membandingkan menulis kontrak API sebelum implementasi dengan menurunkan kontraknya dari kode.
Selamat Datang di Blog Baru: Migrasi WordPress ke Next.js
Saya memindahkan blog ini dari WordPress ke Next.js supaya bisa mengontrol desain, konten, dan performanya.
Solusi Leetcode - Logger Rate Limiter
Simpan timestamp terakhir setiap pesan dicetak untuk menerapkan interval logging sepuluh detik.
SOLID: Prinsip OOP yang Baik
Contoh lima prinsip SOLID dan masalah desain yang diselesaikan oleh masing-masing prinsip.
Pola Algoritma
Pola problem solving dari LeetCode, dikelompokkan seputar array, linked list, heap, stack, dan pointer.
Solusi Leetcode - Merge k Sorted Lists
Membandingkan metode sequential, pairwise, dan heap untuk merge beberapa linked list yang udah terurut.
Solusi Leetcode - N-Queens II
Menghitung susunan queen yang valid dengan backtracking, pengecekan kolom, dan mask diagonal.
Solusi Leetcode - Valid Number
Membandingkan regular expression, parsing eksplisit, state machine, dan boolean flags untuk memvalidasi string angka.
Solusi Leetcode - Rotate Array
Rotate array ke kanan dengan tiga kali reversal dan extra space yang konstan.
Solusi Leetcode - N-Queens
Pakai backtracking untuk mencari susunan papan catur tanpa dua queen yang saling menyerang.
Memahami Priority Queue (Min-Heap)
Membangun min heap dan memakainya untuk memasukkan item dan mengambil item terkecil berdasarkan prioritas.
Solusi Leetcode - Candy
Pakai dua pass untuk membagi permen sambil memenuhi perbandingan rating setiap anak dengan tetangganya.
Solusi Leetcode - Best Time to Buy and Sell Stock II
Jumlahkan setiap kenaikan harga untuk mendapatkan profit maksimum dari transaksi saham yang jumlahnya tanpa batas.
Solusi Leetcode - Best Time to Buy and Sell Stock
Lacak harga terendah sejauh ini untuk mencari profit terbaik dari satu transaksi saham.
Solusi Leetcode - Reverse Linked List
Membandingkan cara membangun ulang linked list dengan membalik link yang udah ada, pakai extra space yang konstan.
Pengantar Manipulasi In-Place pada Linked List
Membalik linked list dengan mengubah link-nya sambil tetap menjaga akses ke node yang tersisa.
Pengenalan Priority Queue
Priority queue memilih item berikutnya berdasarkan prioritas, dengan heap sebagai implementasi yang umum.
Solusi Leetcode - Container With Most Water
Geser dua pointer saling mendekat untuk mencari luas container terbesar dalam waktu linear.
Solusi Leetcode - Trapping Rain Water
Hitung air yang terperangkap dari bar tertinggi di tiap sisi, lalu kurangi storage tambahan dengan two pointers.
Solusi Leetcode - Palindrome Permutation
Hitung frekuensi tiap karakter untuk mengecek apakah sebuah string punya permutasi yang berupa palindrome.
Pengenalan Knowing What to Track
Pilih state yang dibutuhkan sebuah algoritma, misalnya jumlah kemunculan, value yang udah dikunjungi, atau hasil terbaik sejauh ini.
Solusi Leetcode - Logger Rate Limiter
Simpan timestamp terakhir setiap pesan dicetak untuk menerapkan interval logging sepuluh detik.
Solusi Leetcode - Design HashMap
Bikin HashMap pakai bucket dan tangani collision lewat separate chaining.
Pengenalan Hash Map
Hash map menyimpan pasangan key dan value untuk lookup, insertion, dan deletion.
Solusi Leetcode - Implement Queue Using Stacks
Pakai dua stack untuk menjaga urutan queue dan bikin setiap operasi berjalan dalam amortized constant time.
Solusi Leetcode - Remove All Adjacent Duplicates In String
Pakai stack untuk menghapus pasangan duplikat yang bersebelahan, termasuk pasangan baru yang muncul dari penghapusan sebelumnya.
Pengenalan Stack
Stack mengeluarkan item yang terakhir ditambahkan lebih dulu, dan ini berguna untuk pencocokan, membalik urutan, dan operasi bersarang.
Solusi Leetcode - Linked List Cycle
Membandingkan set berisi node yang udah dikunjungi dengan algoritma Floyd untuk mendeteksi cycle di linked list.
Solusi Leetcode - Happy Number
Pakai cycle detection untuk mengecek apakah jumlah kuadrat digit yang dihitung berulang-ulang bakal sampai ke 1.
Teknik Fast and Slow Pointers
Pakai dua pointer dengan kecepatan berbeda untuk mendeteksi cycle tanpa menyimpan kumpulan node yang udah dikunjungi.
Solusi Leetcode - Sum of Three Values
Urutkan array, tetapkan satu nilai, lalu pakai two pointers untuk mencari tiga nilai yang jumlahnya sama dengan target.
Solusi Leetcode - Valid Palindrome
Bandingkan karakter dari kedua ujung sambil melewati tanda baca dan mengabaikan huruf besar kecil.
Pengenalan Two Pointers
Pakai dua posisi di array untuk mengurangi pencarian berulang, kalau struktur input-nya memungkinkan.
Karier, Ketahanan, dan Kerja
Tulisan personal soal masa-masa berat, berkembang, cocok-nggaknya sama tim, kepemimpinan, dan bangkit lagi setelah jatuh.
Empat Tahun di Xendit, dan Mutual Termination Agreement
Saya keluar dari Xendit lewat Mutual Termination Agreement. Ini versi jujur tentang apa yang terjadi, apa yang saya bangun, dan apa yang selanjutnya.
With Hardship Comes Ease
Refleksi yang lebih tenang tentang Quran 94:5, minggu yang berat, dan usaha untuk percaya bahwa kesulitan nggak akan berlangsung selamanya.
Kode, Popok, dan Deadline
Jadi ayah sambil memikul proyek software yang sulit mengajarkan saya betapa rapuhnya fokus, dan betapa pentingnya dukungan.
Hidup, Cinta, dan Musik
Tulisan personal lama soal musik, hubungan, keluarga, dan emosi yang membentuk orang di balik kerjaan ini.
With Hardship Comes Ease
Refleksi yang lebih tenang tentang Quran 94:5, minggu yang berat, dan usaha untuk percaya bahwa kesulitan nggak akan berlangsung selamanya.
Kode, Popok, dan Deadline
Jadi ayah sambil memikul proyek software yang sulit mengajarkan saya betapa rapuhnya fokus, dan betapa pentingnya dukungan.
Cinta Sudah Mati
Refleksi puitis tentang kenyataan pahit mencintai seseorang yang nggak akan pernah bisa membalas cintamu
Kamu Nggak Akan Pernah Tahu Seberapa Berarti Kamu Buat Saya
Kalau saya bisa bilang lewat kata-kata seberapa berarti kamu buat saya, saya bakal bilang I love you
Fake Happy, eh?
Paramore lagi-lagi berhasil membuat saya terkagum-kagum. Kali ini dengan lagu yang berjudul Fake Happy, dengan lirik mereka yang sangat dalam.