Trang chủ / Bài viết
Ghi chép khi làm sản phẩm
Các bài viết của Vũ Minh Hòa về những dự án cá nhân: chúng chạy thế nào, vì sao chọn cách làm đó, và mình sẽ làm khác ở đâu.
Các bài viết được soạn với sự hỗ trợ của AI, dựa trên mã nguồn và tài liệu của chính các dự án.
01 / 9 bài
Backend, dữ liệu & hạ tầng
Xử lý luồng dữ liệu, audit log, đồng bộ thời gian thực, tìm kiếm và server chạy các dự án.
Một Keycloak cho nhiều app: realm, audience và những lỗi khó thấy
Keycloak tự host cho nhiều side project: mỗi app một realm, kiểm aud, user đã xoá bị tạo lại từ token còn hạn, refresh chạy đua và bẫy lúc khởi động.
· 9 phút đọc
Exactly-once không tự có: Kafka, Flink và ClickHouse
Dữ liệu mất hay bị đếm trùng ở đâu trong một pipeline sự kiện: khoá idempotency giữ quá sớm, bộ đệm sink nằm ngoài checkpoint, và materialized view.
· 7 phút đọc
Audit log chống sửa trong PostgreSQL với chuỗi hash và HMAC
Dựng audit log mà lịch sử không thể bị sửa âm thầm, từng lớp một, kèm cách phát hiện bị cắt đuôi và xoá IP mà không làm đứt chuỗi.
· 6 phút đọc
Server-Sent Events trong Spring Boot: Redis Pub/Sub và client chậm
Realtime với SseEmitter: xác thực EventSource bằng cookie, fan-out qua nhiều instance, pool ghi có trần biết bỏ gợi ý, và khi nào nên tính tới WebFlux.
· 7 phút đọc
Thời gian trong Apache Flink: watermark, phân vùng rảnh, state TTL và replay
Sự kiện muộn bị bỏ không báo, một phân vùng im lặng làm mọi window đứng yên, TTL theo đồng hồ thật, và timer processing-time phá replay tất định.
· 6 phút đọc
Tìm kiếm tiếng Việt với Elasticsearch: bỏ dấu, n-gram và thứ tự bộ lọc
Tìm tiếng Việt có dấu hay không dấu đều khớp: asciifolding, vì sao stopword phải đứng trước nó, n-gram cho mã thiết bị, phân trang search_after.
· 6 phút đọc
Theo dõi xu hướng tin tức tiếng Việt bằng embedding, HDBSCAN và LLM
Cách mình gom bài từ ~95 nguồn tin tiếng Việt thành chủ đề, chấm điểm chủ đề nào đang nóng lên hay nguội đi, và để LLM giải thích vì sao.
· 8 phút đọc
Mô hình hoá quy trình đấu thầu vật tư bệnh viện: bài học từ đồ án tốt nghiệp
Quy trình đấu thầu khoảng 30 bước trong phần mềm: một bản ghi từ đề xuất tới nghiệm thu, giai đoạn là JSON có mặc định, nghiệm thu trong một transaction.
· 9 phút đọc
Tự vận hành server cho dự án cá nhân: nguyên tắc và những lỗi im lặng
Đưa hạ tầng vào git, giảm bề mặt tấn công, deploy canary, và những lỗi không hề báo lỗi: pipefail, concurrency của GitHub Actions, bind mount của Docker.
· 7 phút đọc
02 / 6 bài
Ứng dụng local-first
App vẫn chạy khi mất mạng: giao thức đồng bộ, IndexedDB với dữ liệu lớn và PWA trên iPhone.
Đồng bộ cho PWA local-first: last-writer-wins làm cho đúng
Đồng bộ offline với IndexedDB: đẩy lên idempotent, tombstone, giữ thứ tự seq bằng advisory lock, chỉnh đồng hồ theo server, tránh xung đột từ thiết kế dữ liệu.
· 7 phút đọc
Bốn lỗi làm RxDB sync hỏng trong im lặng, và cách sửa
Hàng kẹt ở version 0, một cột chỉ có ở client, migration không bao giờ xong, và vòng lặp đồng bộ lại: những lỗi không hề ném ra lỗi.
· 9 phút đọc
Cây dữ liệu lớn trong IndexedDB với RxDB: index, tìm kiếm trigram và tải lười
Vì sao một ID cha nullable khiến truy vấn 61 node mất 19,6 giây, và cách index bóng, trigram bỏ dấu cùng virtualize sửa nó.
· 7 phút đọc
PWA cài trên iPhone: cập nhật an toàn, deploy và những chi tiết của iOS
Cập nhật chờ người dùng, deploy làm hỏng tab đang mở, logo đo trên máy thật, ô nhập làm trang phóng to, và Web Push cho app local-first.
· 8 phút đọc
Đọc số tiền theo cách người Việt gõ: 2,5tr, 500k và 1tr+500k
Đơn vị như tr và tỷ, dấu chấm mang hai nghĩa, phép tính gõ như Excel, giữ con trỏ đúng chỗ, và bàn phím số điện thoại không có phím cộng.
· 7 phút đọc
Âm lịch Việt Nam trong JavaScript: vì sao 5 mốc thử là chưa đủ
Vì sao một thư viện âm lịch phổ biến lệch lịch Việt Nam 3,48% số ngày (UTC+8 so với UTC+7), phát hiện khi so 40.542 ngày thay vì 5 mốc.
· 7 phút đọc
03 / 5 bài
Bảo mật & macOS
Mã hóa đầu-cuối và công cụ giám sát macOS dựa trên Endpoint Security.
Mã độc DarkSword trên iPhone: chuỗi sáu lỗ hổng, biến thể P7 và iOS nào an toàn
Chuỗi khai thác DarkSword chạy thế nào, biến thể P7 lấy gì, phiên bản iOS nào an toàn, và cần làm gì khi chưa cập nhật được.
· 10 phút đọc
Xây dựng ứng dụng chat mã hoá đầu cuối (E2EE) với libsodium
Thiết kế khoá của một app chat E2EE: khoá riêng cho từng cuộc trò chuyện, chuỗi tin nhắn có chữ ký, và giới hạn chung khi phát hiện server gian lận.
· 7 phút đọc
Endpoint Security trên macOS không cần entitlement: eslogger và Swift
Đọc eslogger từ một helper Swift chạy root: Full Disk Access, bộ lọc Aho–Corasick một lượt trên JSON thô, quy tắc gắn với chương trình, và tự báo nhầm.
· 7 phút đọc
Làm một công cụ giám sát máy Mac khó bị tắt lén
Phân biệt khởi động lại với kill -9, bot Telegram tự xoá được cảnh báo, hai tiến trình canh nhau, log chỉ-ghi-thêm và công tắc người chết.
· 7 phút đọc
Từ script Bash quét liên tục sang daemon Swift chạy theo sự kiện trên macOS
Daemon bảo mật macOS từ ~4,5% xuống ~0,4% một nhân: API thay fork, FSEvents và IOKit, lọc trước bằng ctime, và netstat lặng lẽ ẩn socket.
· 8 phút đọc
04 / 2 bài
Web & mã nguồn mở
Thư viện phân tích SEO và các quy tắc đằng sau điểm số.
Fork một thư viện GPL, publish lên npm mà không mất liên kết upstream
Fork yoastseo của Yoast: thông báo theo GPL, một merge không đổi nội dung để đồng bộ thành merge ba chiều, đồng bộ hằng tháng, và quy tắc giữ ít conflict.
· 7 phút đọc
Soát công cụ chấm điểm SEO theo tài liệu Google, và lỗi tính điểm âm thầm
Truy từng quy tắc của một công cụ chấm điểm SEO mã nguồn mở về hướng dẫn của Google, cái gì đổi khi thiếu nguồn, và lỗi tính điểm không hề báo lỗi.
· 9 phút đọc