Blog
Measured studies, open-source implementations, and production lessons across edge AI, agent reliability, privacy, cost, and security.
Measured studies, open-source implementations, and production lessons across edge AI, agent reliability, privacy, cost, and security.
Writing software helped shape how we think as engineers. As AI takes over more implementation, I worry about discovery debt: the questions and insights we miss when we skip the work that might have revealed them. Here is how I want to preserve understanding, curiosity, and judgment while working with coding agents.
Lập trình từng đồng thời tạo ra phần mềm và người kỹ sư. Khi AI tách hai quá trình ấy, chúng ta có thể tích lũy một loại nợ khó nhìn thấy: những hiểu biết không bao giờ xuất hiện vì không còn phải vật lộn với việc triển khai. Làm thế nào để giữ lại những va vấp tạo nên khả năng phán đoán?
Huấn luyện đang dần quay về máy của người dùng, nơi phần cứng nằm ngoài tầm kiểm soát của nhà phát triển. Tôi đã để GPU trên máy Mac bị bỏ không suốt hai năm vì ứng dụng vẫn chạy được, chỉ là chậm. Khi bật Metal và đo đạc nghiêm túc, tôi phát hiện bốn lỗi hiệu năng không hề báo lỗi: is_bf16_supported() nhận nhầm khả năng phần cứng, gradient scaler âm thầm bỏ qua optimizer step, 16-bit chậm hơn 32-bit trên Apple Silicon, và giao diện báo dùng GPU trong khi mô hình thực tế chạy trên CPU.
Training is moving back onto the machines people own, and those machines are not a fleet you control. Apple GPU support sat on my plan for two years because nothing looked broken; the runs finished, they were just slower. Turning Metal on was worth 1.7x to 4.2x per epoch on the one M1 I own, and much less end to end. The measuring is what found the real bugs, three of which never raised anything: is_bf16_supported() answering True on a card that only emulates it, a gradient scaler silently dropping optimiser steps and halving a mAP, and 16-bit being slower than 32-bit on Apple Silicon even though everything works.
Models almost never ask you what you meant: across ambiguous questions, answer rates run above 95% and clarification barely registers. Repairing that in conversation makes it worse: underspecified multi-turn runs measure a 39% average performance drop, driven by a 112% jump in unreliability, and the effect shows up from two turns onward. The leverage is no longer in writing better prompts. It is in forcing the questions out before the first answer attempt, and in asking the questions afterward that prove you understood what you shipped.
A Flatpak build that passed every structural check and still died one line into launch. Why green CI proved nothing about the GUI, and how to install the real artifact and start it under Xvfb instead.
WebMCP lets a web page hand callable tools to browser AI agents instead of making them scrape the DOM. I wired three read-only tools into this site. The interesting part was not the API. It was deciding what an agent, or a prompt injection riding one, is allowed to do.
When a machine writes most of your diff, the constraint stops being how fast you type and becomes how well you review. Here is the SDLC I actually run (the provenance audit, the sandbox, the CI backstops, and the three questions I ask every AI-authored change) plus the parts of review that don't compress and never will.
On small local models, the standard ReAct loop has a failure mode nobody warns you about: the model calls one tool, declares victory, and stops. What we measured across 12 GGUF models in EdgeVox, why we added a plan-once dispatcher, and how to decide which loop your task actually needs.
A first-hand build narrative of EdgeVox, a fully offline voice agent that chains speech-to-text, a local LLM, and text-to-speech on one device. The architecture in plain language, ROS2 integration, the latency budget, and the failure modes nobody warns you about.
Building a represent-me chatbot is a weekend project. Treating it like a production security surface is the part nobody writes about. Here is the architecture, the prompt leak I found by attacking my own bot, and the reusable suite that keeps it honest.
Việt Nam đã có chip, có ba nỗ lực làm mô hình nền tảng tiếng Việt đang chạy, và bộ luật AI ràng buộc nhất Đông Nam Á. Vậy mà câu chuyện chủ quyền AI cứ xoay quanh một mô hình 70B. Khoảng trống thật nằm thấp hơn một tầng: đánh giá mở, dữ liệu sạch về giấy phép, mô hình chuyên biệt gắn với tuân thủ, và runtime chạy thẳng trên thiết bị. Từ 15/8/2026, Quyết định 33/2026/QĐ-TTg với 46 hệ thống AI rủi ro cao đã biến tầng đó thành nghĩa vụ pháp lý.
Vietnam already has the chips, three meaningful Vietnamese model attempts in flight, and the most binding AI law in Southeast Asia. The conversation about sovereign AI keeps demanding a 70B foundation model. The actual gap is one layer down: open evaluation, license-clean data, compliance-aware specialized models, and on-device runtimes that operationalize Law 134/2025 from March 2026.
A 2025 RCT found students who studied with ChatGPT scored 11 points lower on a retention test six weeks later, even though their work during the sessions was higher quality. Better results, worse thinking. Here is what the cognitive science says, and how it changed my own AI habits.
NVIDIA just open-sourced OpenShell, a policy-enforced sandbox for autonomous AI agents. Four security layers, a privacy router that decides which LLM sees which data, and hot-reloadable YAML policies. How it works and what it solves that nothing else does.
Vibe coding giúp đưa ứng dụng ra thị trường nhanh hơn, nhưng cũng làm tăng nguy cơ phát hành lỗ hổng bảo mật. Bài viết phân tích các sự cố thực tế, quy trình phòng thủ nhiều lớp và những phương pháp rà soát bảo mật mới với AI.
Vibe coding is shipping apps faster than ever, but also shipping vulnerabilities at alarming rates. This guide covers real disasters, practical security measures from secret scanning to endpoint hardening, and SOTA AI-powered review methods to keep your vibe-coded apps from becoming the next breach headline.
Coding isn't what it used to be. AI implements faster than we can type, and agents are automating our tasks. But there's a bright side: we're evolving from implementors into architects and reviewers. Here's how to survive the shift.
AI có thể viết mã nhanh hơn tốc độ chúng ta gõ và đang tự động hoá ngày càng nhiều công việc thường ngày. Vai trò của kỹ sư vì thế chuyển dần từ người trực tiếp triển khai sang người thiết kế, đánh giá và chịu trách nhiệm cho toàn hệ thống.
AI agents don't just talk. They execute code, which makes isolation the whole problem. The sandbox technologies that matter (microVMs, gVisor, WebAssembly) and the platforms built on them (E2B, Modal, Northflank).
AI agent không chỉ sinh văn bản mà còn trực tiếp thực thi mã. Bài viết phân tích các công nghệ sandbox như microVM, gVisor và WebAssembly, cùng những nền tảng phổ biến được xây dựng trên chúng.
OpenClaw, formerly Clawdbot, runs a personal AI agent locally and wires it straight into your messaging apps. Its gateway architecture, the security failures that followed, and what building a safe autonomous ecosystem would actually take.
Squared ReLU computes the square of a rectified activation. This note explains why Primer used it, how it changes gradients, and when not to adopt it blindly.
Ubuntu 24.04 cannot run different fractional scaling on a 4K laptop panel and a 2K external monitor. Upgrading to 24.10 and moving NVIDIA to Wayland fixes it.
Ubuntu 24.04 ships the original Kazam, not Kazam 2. How to build and install Kazam 2 from source, with the dependencies, PulseAudio support, and the optional OCR components.
Xorg, your desktop environment, and the browser can hold several GB of VRAM before training starts. How to find what is sitting on the GPU and hand that memory back.
Fine-tuning Llama 3.2 at 1B and 3B, then running the result locally in Llama Assistant. From the pre-trained models through tuning on your own data to on-device deployment.
Amending one commit message is easy; a run of them is not. How to rewrite several past messages at once with interactive rebase, after a batch of commits shipped without their story numbers.
Privacy in AI is a hot topic. I created Llama Assistant to provide a privacy-focused alternative to popular AI assistants like ChatGPT or Claude AI. In this blog post, I'll share my motivation behind creating Llama Assistant and how it differs from other AI assistants.
SegFormer Mix-FFN inserts a depthwise 3×3 convolution between two feed-forward projections, giving image tokens local spatial context without explicit positional embeddings.
LayerScale multiplies each Transformer residual branch by a learned per-channel gain initialized near zero, helping very deep image Transformers begin close to an identity mapping.
Fifteen productivity tips from Dr. Milan Milanovic, covering single-tasking, the 3:3:3 plan, daily deep-work blocks, and the Feynman technique for learning something new.
Where a Django app actually slows down as traffic grows. Benchmark first, then fix the database queries, add the right caching layer, and scale instances with Docker and Kubernetes.
A short note on Vinh Khuat's multi-instrument performance and what it shares with software: love the craft first, practice the tools, then build something whole.
Notes from Minh Vu's session on teaching as a core engineering skill: explaining something is how you consolidate it, which is why leads, founders, and engineers all end up teaching.
A 2023 record of moving this blog to Cloudflare Pages for free bandwidth on a static export, kept for history. The site runs on Vercel Pro again, because API routes, Postgres, the RAG chatbot, and cron jobs all need the compute.
A short review of advancements in YOLO-NAS - a new YOLO architecture born from Neural Architecture Search.
Câu chuyện xây dựng AnyLabeling trên nền Labelme: từ việc tích hợp Segment Anything và YOLO vào quy trình gán nhãn cho đến hỗ trợ dữ liệu OCR.
How I built AnyLabeling on top of Labelme: why the tool needed to exist, how Segment Anything and YOLO inference is wired into the labeling loop, and how text OCR labeling works.
Varifocal Loss trains dense detectors to predict a score that combines object confidence with localization quality, while focusing training on difficult negative examples.
Django opens a fresh database connection on every request. Set CONN_MAX_AGE for persistent connections, and add pooling when the database does not share a server with the backend.
DeBERTa separates token content from relative position, then combines content-to-content, content-to-position, and position-to-content attention scores.
Comparing Airflow, MLflow, and Kubeflow for MLOps: what each does, how Airflow plus MLflow stacks up against Kubeflow, and which to pick by scale.
ReGLU, GEGLU, and SwiGLU multiply one linear projection by an activated gate, giving Transformer feed-forward layers a learned control path.
Daisykit, a graph-based C++ and Python toolkit for deploying AI pipelines, from face detection to pose estimation and barcodes, in a few lines of code.
How to install OpenCV 4 on macOS with Homebrew for C++, plus the pip and conda routes for Python, tested on an Apple M1 Macbook Air.
My macOS setup note for a Macbook Air M1: Homebrew, daily apps, coding IDEs, and a ZSH plus iTerm2 terminal for a full development environment.
GhostNet generates a small set of intrinsic feature maps with a normal convolution, then expands them using cheap depthwise operations. Here is how its module and bottleneck work.
Two ways to get ROS 2 Foxy running on a Raspberry Pi 4: flash my prebuilt Ubuntu image, or set up Ubuntu, the desktop, and ROS 2 from scratch.
A review of YOLOX, the anchor-free YOLO with a decoupled head and SimOTA, plus a hands-on traffic-sign detection experiment on the VIA dataset.
Reading notes on three papers: CenterTrack for 2D tracking, CenterPoint for 3D detection and tracking, and CenterPoint++ for the Waymo real-time challenge.
Review of three papers in one line of work: CenterTrack for 2D tracking, CenterPoint for 3D detection and tracking, and CenterPoint++, the Waymo Real-time 3D Detection Challenge submission.
A paper review of SECOND, the sparse-convolution 3D LiDAR detector: its GPU rule generation, angle loss, and point-cloud data augmentation.
Conditional batch normalization predicts the affine scale and bias from a conditioning input, allowing language, class labels, or another signal to modulate visual features.
Streaming 800x600 video over HTTP from a five-dollar ESP32-CAM board, running a face detection test on the stream, and what the board is realistically good for.
Installing the Fira Code font on Ubuntu, with the commands for 16.04 and for 17.04 through 24.04. A programming font with ligatures, and the one I use everywhere.
My setup notes for a fresh Ubuntu machine, tested on 20.04 through 24.04: a script that installs most of the packages in one pass, plus the manual steps for everything it does not cover.
Replacing bash with Zsh on Ubuntu: install the shell, add Oh My Zsh, and wire up the zsh-autosuggestions plugin. Three steps, and the shell setup I keep coming back to.
Building a desktop pushup counter that combines human keypoint detection with signal processing to count reps from a webcam, no sensors needed.
Lecture 1 notes from the Apex.AI Autoware course: getting the development environment up with Docker, ROS 2, Terminator, and Autoware.Auto, the errors I hit along the way, and how I fixed them.
Course notes from Udacity's Self-Driving Fundamentals, featuring Apollo. What the seven lessons cover, from HD maps and localization through perception, prediction, planning, and control. Every diagram in the series is redrawn.
Lesson 7: steering, throttle, and brake that follow the planned trajectory while keeping passengers comfortable. PID, LQR, and model predictive control, with the tradeoffs of each.
Lesson 6: turning a map, a position, and a set of predictions into a trajectory. Routing the world as a graph, Frenet coordinates, path-velocity decoupled planning, and reading an ST graph.
Lesson 5: predicting what everything else on the road will do next. Model-based against data-driven approaches, lane-sequence prediction, and using an RNN to produce a trajectory for each tracked object.
Lesson 4: turning camera, LiDAR, and radar data into objects. Classification, detection, and segmentation, what each sensor is good and bad at, and why Apollo fuses them rather than trusting one.
Lesson 3: how the vehicle places itself to single-digit-centimetre accuracy. Inertial navigation, GNSS and IMU, RTK, LiDAR and visual localization, and the multi-sensor fusion Apollo settles on.
Lesson 2: why a self-driving car needs an HD map rather than the one on your phone. Centimetre precision, lane markings and a 3D road network, how localization rides on top of the map, and how the maps get built.
Lesson 1: what actually makes up a self-driving car. The six levels of autonomy, how a machine driver differs from a human one, and the three layers of the Apollo platform: hardware, the open software stack, and the cloud services.
Lovász-Softmax is a differentiable surrogate for the Jaccard/IoU loss. It sorts pixel errors and weights them by the discrete change they cause in IoU.
Hai cách cài VS Code chạy ngay trên Google Colab để dùng trình soạn thảo quen thuộc mà vẫn tận dụng GPU miễn phí: qua ColabCode và thiết lập thủ công.
Chặng đường phát triển của YOLO từ v1 đến v3: ý tưởng cốt lõi và các cải tiến kiến trúc, kỹ thuật qua từng phiên bản phát hiện vật thể.
The three deep networks behind my Jetson Nano ADAS: CenterNet detection, a ResNet-18 sign classifier, U-Net lane segmentation, plus TensorRT tuning.
Software design of an ADAS on Jetson Nano: forward collision warning, lane departure detection, and speed-limit sign over-speed alerts.
Building an ADAS prototype on a Jetson Nano: the motivation, feature scope, and hardware design for collision, lane-departure, and speed-limit warnings.
Giải pháp giành giải Nhì IBM Hackathon 2020: dùng mã ARUCO và xử lý ảnh tách nét viết trên giấy, stream thành webcam ảo cho học trực tuyến.
Cách nhóm xây xe tự hành trong giả lập Cuộc Đua Số: ENet phân đoạn đường, FaceBoxes phát hiện biển báo và điều khiển lái bằng PID.
CBHG is the sequence-processing block used in the original Tacotron: a 1D convolution bank, highway network, and bidirectional GRU working at different context scales.
Phân tích CenterNet - Objects as Points: đưa phát hiện vật về ước lượng keypoint trên heatmap, các hàm loss và cách huấn luyện mạng.
Kinh nghiệm thiết lập Jetson Nano cho dự án AI nhúng: chọn nguồn, cài LXDE tiết kiệm RAM, tạo swap file và cài đặt TensorFlow.
Tổng hợp các khoá học, blog và paper về học máy mà tôi đã học qua, kèm đánh giá ngắn cho từng tài liệu. Dành cho người mới bắt đầu với học máy và học sâu.
Hướng dẫn gọi hàm Python xử lý ảnh từ C++ bằng Boost.Python, chuyển đổi qua lại giữa cv::Mat và NumPy array để tái dùng code sẵn có.
VGG perceptual loss compares generated and target images in a frozen feature space instead of requiring every output pixel to match.
Giới thiệu hồi quy tuyến tính từ lý thuyết toán học đến cài đặt bằng NumPy và scikit-learn, kèm phân tích điểm yếu nhạy cảm với nhiễu.
Set an Intel integrated GPU as the display renderer on Ubuntu 18.04 so your NVIDIA GPU's full VRAM stays free for CUDA and model training.
Accuracy alone hides a bad classifier. A walkthrough of the confusion matrix and what is built from it: precision, recall, specificity, F-score, and the AUC-ROC curve, with when each one is the metric that matters.
Giải thích nguyên lý Hough Transform và cách dùng OpenCV để phát hiện đường thẳng trong ảnh, từ không gian tham số cực đến code Python thực tế.
Thiết kế thùng rác thông minh dùng Raspberry Pi 3 và SSD MobileNetV2 để nhận dạng chai lọ qua camera, tự động phân loại rác tái chế bằng servo.
Tự viết lại kiến trúc VGG16 bằng Tensorflow Keras và huấn luyện phân loại chó mèo trên dataset Kaggle, đạt độ chính xác 95.34%.
Giới thiệu ngành thị giác máy tính, các ứng dụng thực tế và lộ trình kiến thức cần học để bắt đầu làm việc trong lĩnh vực này.
So sánh các hàm kích hoạt Sigmoid, Tanh, ReLU, Leaky ReLU và Maxout trong mạng nơ-ron: ưu, nhược điểm và cài đặt Python.
Xây dựng bộ phân loại chó, mèo, gấu trúc bằng k-NN với scikit-learn, so sánh trực tiếp điểm ảnh và đánh giá kết quả.
How to regain SSH access to an AWS EC2 Ubuntu instance after ufw locks you out, by disabling the firewall via a user-data script.
How to attach lifecycle methods like componentDidMount to a React functional component using the react-pure-lifecycle package.
Danh sách các phần mềm và package tôi hay cài trên Ubuntu cho công việc lập trình, kèm lệnh cài đặt cho từng gói.
Nguyên lý lọc ảnh và các bộ lọc trung bình, Gauss, trung vị, Bilateral, Sobel và Laplacian trong OpenCV kèm code Python.
Thao tác cơ bản với ảnh trong OpenCV bằng C++: tạo cv::Mat, đọc/ghi ảnh, truy cập từng điểm ảnh và sao chép ma trận ảnh.
Ảnh số raster và vector, các không gian màu RGB, CMYK, HSV, CIE Lab và cách chuyển đổi không gian màu trong OpenCV.
Hướng dẫn xây dựng file cấu hình Emacs từ đầu: theme, package manager, Ivy, company, neotree và các phím tắt hữu ích.
Fix the mysql2 gem compile error on macOS when using MAMP by pointing gem install at the right mysql_config path.
Minify every JavaScript file in a folder with a short UglifyJS plus Bash loop, no Grunt setup required.
Cách nhập chuỗi trong C chạy được trên Linux, macOS và Windows, xử lý lỗi trôi lệnh mà fflush không giải quyết được.
Cách lấy đúng IP thật của client trên Heroku bằng Node.js qua header x-forwarded-for thay vì req.ip.
Tự xây backend Node.js gửi mail bằng nodemailer để xử lý contact form cho web tĩnh, kèm hướng dẫn deploy Heroku.
Các hàm JavaScript để xoá dấu tiếng Việt, lọc ký tự không hợp lệ và chuẩn hoá khoảng trắng khi xử lý chuỗi.
Kinh nghiệm cài đặt và thiết lập Fedora Workstation 24: gõ tiếng Việt, phím tắt, quản lý gói dnf và kho RPM Fusion.
Thuật toán loang (flood fill) đệ quy để mở vùng ô trống trong game dò mìn, kèm ví dụ minh hoạ và code C.
Thuật toán sinh mìn ngẫu nhiên cho game dò mìn viết bằng C, kèm code đặt mìn và đếm số mìn quanh mỗi ô.
Hướng dẫn thay đổi độ phân giải màn hình Raspberry Pi qua tệp config.txt với các giá trị hdmi_group và hdmi_mode
A beginner guide to GNU Emacs: why use it for coding, how to install it on Ubuntu, and the essential file, edit and cursor shortcuts
Hướng dẫn cài bộ cấu hình Emacs cho lập trình C trên Ubuntu và viết Makefile cơ bản để biên dịch, chạy chương trình
Vì sao lập trình viên nên có website cá nhân: xây thương hiệu, giữ động lực, rèn kỹ năng và gợi ý cách bắt đầu tạo web
Cấu trúc rẽ nhánh trong C: cú pháp if, if...else, if...else if và switch case kèm các ví dụ minh họa chạy được
Cách khai báo biến, hằng và các kiểu dữ liệu trong C, cùng nhập xuất dữ liệu bằng printf và scanf với các đặc tả định dạng
Tổng hợp các toán tử trong C: số học, quan hệ, logic, thao tác bit, gán, tăng giảm, bảng thứ tự ưu tiên và cách ép kiểu
Hướng dẫn cài Geany và gcc trên Ubuntu để soạn thảo, biên dịch và chạy chương trình C, dùng phím F9 để dịch và F5 để chạy
Giải thích cấu trúc một chương trình C cơ bản qua ví dụ Hello World: lệnh tiền xử lí, hàm main, biến và comment
Giới thiệu chuỗi bài học lập trình C từ cơ bản: công cụ Geany, gcc trên Ubuntu và cách học hiệu quả cho người mới bắt đầu
Cách cấu hình build system trong Sublime Text 3 với gcc để biên dịch và chạy chương trình C ngay trong trình soạn thảo
Suy nghĩ về đam mê: phân biệt sở thích với đam mê, cách tìm ra sở trường và theo đuổi đam mê để cuộc sống có ý nghĩa