Writing
Blog
A place for engineering notes, experiments, and posts about coding topics that are worth writing down.
AArch64 Register Conventions: What Survives a Function Call—and Why
A practical guide to caller-saved and callee-saved registers, argument passing, X30/LR, SIMD registers, and what the ABI—not the CPU—actually guarantees across a function call.
Implementing a std::vector-style container in C99
Building a typed, growable contiguous array in C99 with macros, realloc, and a deliberately small API inspired by std::vector.
Building a Linux Kernel Module in Pure x86
An exploration of what happens when the compiler abstraction is removed and a Linux kernel module is written directly in x86-64 assembly.
Implementing std::variant from scratch
A step-by-step journey through building your own std::variant, then peeking under the hood of libstdc++ and libc++ to see how the real thing works.
Bringing Zephyr RTOS to an ESP32 board
A compact first bring-up of Zephyr on ESP32, from hello world to fixing the blinky sample with a device tree overlay.
Debugging multithreaded programs with GDB
A practical GDB workflow for multithreaded programs, with emphasis on thread apply all and on commands that GDB can run automatically for you.
EU NIS2 Directive: what engineering teams should actually care about
A practical overview of the EU NIS2 Directive, who it affects, and what it means for security, operations, incident reporting, and software teams.
SchemAI — an AI-powered schematic assistant for KiCad
Building an open-source tool that parses KiCad schematics into a structured circuit graph and lets you ask an LLM questions about your design — architecture, code walkthrough, and future plans.
Streaming MJPEG from a Raspberry Pi 4 camera via Yocto Linux
A practical walkthrough of streaming OV5647 camera video over HTTP from a Pi 4 running a custom Yocto build — covering the bcm2835-unicam driver bug, libcamera integration, gstreamer pipelines, and a lightweight HTTP relay server.
Debugging an OV5647 device tree overlay on Raspberry Pi 4
A walkthrough of fixing a non-working camera overlay on Pi 4 — covering the missing fragments, I2C mux topology, clock setup, and how to verify the fix.
Renode as a development tool for embedded devices
A practical starting point for using Renode to develop, debug, and test embedded software before hardware is fully available.
C++ coroutines through the compiler's eyes
A reference-style walkthrough of how the C++ standard specifies coroutines and the co_await expression, distilled into pseudocode that mirrors what a compiler actually does.
Decoupled CRTP in C++: classic CRTP, OpenJDK-style decoupling, and the C++23 mixin style
What classic CRTP is, what decoupled CRTP means in the OpenJDK-style design, and how C++23 explicit object parameters relate to both.
Running a Docker container with GUI on Fedora
A practical Fedora setup for running X11 GUI apps from a Docker container, including a working ROS Humble example and quick validation steps.
Destructor trap
Why skipping a virtual destructor silently breaks unique_ptr but not shared_ptr, and what the constructor/destructor output tells you.
Practical C++11 std::errc with real examples
A practical C++11 guide to std::errc, std::error_code, and portable error handling with examples for files, validation, retries, and API design.
Memory types and their support in Linux
A practical overview of raw and managed flash memory technologies and how Linux handles each of them through the MTD and block subsystems.
C++26 std::execution, executors, and where the model fits
A practical introduction to the standardized C++26 execution model, with code examples and a simple explanation of how execution context is separated from work.