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.

  1. 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

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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.

  1. Đồ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

  2. 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

  3. 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

  4. 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

  5. Đọ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

  6. Â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.

  1. 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

  2. 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

  3. 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

  4. 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

  5. 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ố.

  1. 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

  2. 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