<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Hanh Pham's Blog</title><link>https://hanhpp.github.io/</link><description>Recent content on Hanh Pham's Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 08 Sep 2026 09:30:00 +0700</lastBuildDate><atom:link href="https://hanhpp.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>tmux Panes &amp; Windows: The Bindings That Actually Matter</title><link>https://hanhpp.github.io/posts/tmux-pane-window-management/</link><pubDate>Tue, 08 Sep 2026 09:30:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/tmux-pane-window-management/</guid><description>Most tmux guides dump the whole key table on you. These are the pane and window bindings that survive contact with a real workday: splits, navigation, layout, and the marked-pane tricks tmux never bound for you.</description></item><item><title>Huawei's Ascend 950 &amp; DaVinci v3: How China Built a Competitive AI Chip Without EUV</title><link>https://hanhpp.github.io/posts/huawei-ascend-950-davinci-v3/</link><pubDate>Mon, 07 Sep 2026 09:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/huawei-ascend-950-davinci-v3/</guid><description>DeepSeek just ordered 160,000 Huawei Ascend 950DT chips: a chip built on a DUV-only process, with self-developed HBM and a homegrown interconnect, because export controls left no other choice. Here&amp;rsquo;s how the thing actually works, and where it still falls short.</description></item><item><title>Making a Multi-Step SQL Server Script's Rollback Actually Trustworthy</title><link>https://hanhpp.github.io/posts/sql-server-trustworthy-rollback-xact-abort/</link><pubDate>Sun, 06 Sep 2026 11:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/sql-server-trustworthy-rollback-xact-abort/</guid><description>When one step in a multi-step SQL Server script fails, what actually happens to your data depends entirely on how you&amp;rsquo;ve wired up error handling, and the default is not what most people assume. Three scenarios, measured with real ledger output.</description></item><item><title>When a Wildcard Join Multiplies Your Data (and How to Actually Fix It)</title><link>https://hanhpp.github.io/posts/sql-server-wildcard-joins-and-unpivot/</link><pubDate>Sat, 05 Sep 2026 10:30:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/sql-server-wildcard-joins-and-unpivot/</guid><description>A join rule that matches &amp;lsquo;anything&amp;rsquo; looks like an ordinary filter, until it quietly multiplies your row count. Measured, not estimated: what a wildcard join actually costs, why a CREATE INDEX line doesn&amp;rsquo;t always buy you a seek, and why UNPIVOT beats a ten-way OR chain.</description></item><item><title>Go 1.27 Is Quietly Load-Bearing</title><link>https://hanhpp.github.io/posts/go-1-27-is-quietly-load-bearing/</link><pubDate>Fri, 04 Sep 2026 10:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/go-1-27-is-quietly-load-bearing/</guid><description>Generic methods finally landed, json/v2 is already running underneath your code, and the allocator got faster while you weren&amp;rsquo;t looking. Six of this release&amp;rsquo;s changes take effect without you opting in; here&amp;rsquo;s which ones will cost you an afternoon.</description></item><item><title>Designing an Order Workflow: Putting the Patterns Together</title><link>https://hanhpp.github.io/posts/microservices-designing-an-order-workflow/</link><pubDate>Thu, 03 Sep 2026 09:30:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/microservices-designing-an-order-workflow/</guid><description>Boundaries, communication styles, technology, and sagas all sound reasonable in isolation. Here&amp;rsquo;s what it looks like to actually apply all four decisions to one real workflow, in order.</description></item><item><title>Agentic Coding Assistants, and Why I Don't Let Them Grade Their Own Work</title><link>https://hanhpp.github.io/posts/how-ai-actually-fits-into-my-dev-workflow/</link><pubDate>Wed, 02 Sep 2026 10:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/how-ai-actually-fits-into-my-dev-workflow/</guid><description>&amp;ldquo;Agentic&amp;rdquo; gets thrown around loosely, but it means something specific: an assistant that decides its own next step instead of waiting for yours. That&amp;rsquo;s also exactly why you can&amp;rsquo;t trust it to tell you when it&amp;rsquo;s done a good job; here&amp;rsquo;s the verification habit that fixes that.</description></item><item><title>When Two-Phase Commit Isn't the Answer: Sagas for Microservice Transactions</title><link>https://hanhpp.github.io/posts/microservices-sagas-vs-two-phase-commit/</link><pubDate>Tue, 01 Sep 2026 10:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/microservices-sagas-vs-two-phase-commit/</guid><description>Splitting a monolith means splitting its database transactions too. The instinct is to reach for a distributed transaction. Here&amp;rsquo;s why that instinct is usually wrong, and what to do instead.</description></item><item><title>How I Started Learning Reverse Engineering (and What I Wish I Knew First)</title><link>https://hanhpp.github.io/posts/how-i-started-learning-reverse-engineering/</link><pubDate>Sat, 29 Aug 2026 15:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/how-i-started-learning-reverse-engineering/</guid><description>I spent my first month with Ghidra staring at assembly I didn&amp;rsquo;t understand, convinced I was too stupid for this. Here&amp;rsquo;s the honest version of how I got from &amp;lsquo;what is a register&amp;rsquo; to solving CTF reversing challenges, and the mistakes that cost me weeks.</description></item><item><title>Anti-Debugging Tricks: When the Binary Fights Back</title><link>https://hanhpp.github.io/posts/anti-debugging-tricks/</link><pubDate>Thu, 27 Aug 2026 11:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/anti-debugging-tricks/</guid><description>Some binaries detect that you&amp;rsquo;re debugging them and crash, change behavior, or hide the flag. This post covers the common anti-debugging techniques and how to bypass them.</description></item><item><title>Custom VMs in CTF: When the Binary Speaks Its Own Language</title><link>https://hanhpp.github.io/posts/custom-vms-in-ctf/</link><pubDate>Tue, 25 Aug 2026 10:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/custom-vms-in-ctf/</guid><description>Some CTF reversing challenges hide the flag behind a custom virtual machine: a program that interprets its own bytecode. This post shows you how to spot them, reverse the instruction set, and write a solver.</description></item><item><title>Your First Crackme: A Walkthrough from strings to Flag</title><link>https://hanhpp.github.io/posts/your-first-crackme-walkthrough/</link><pubDate>Sat, 22 Aug 2026 14:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/your-first-crackme-walkthrough/</guid><description>A crackme is a small binary that asks for a password and checks your input. This post walks through solving one, from downloading the binary to extracting the flag, with every tool click explained so you can follow along.</description></item><item><title>REST, gRPC, GraphQL, or a Broker: Picking Your Communication Tech</title><link>https://hanhpp.github.io/posts/microservices-picking-communication-tech/</link><pubDate>Thu, 20 Aug 2026 09:30:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/microservices-picking-communication-tech/</guid><description>The communication style (sync/async, request-response/event-driven) narrows the field. Here&amp;rsquo;s how the actual technologies stack up once you&amp;rsquo;re choosing among them.</description></item><item><title>Ghidra in 30 Minutes: Reading Assembly Without Hating It</title><link>https://hanhpp.github.io/posts/ghidra-in-30-minutes/</link><pubDate>Tue, 18 Aug 2026 11:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/ghidra-in-30-minutes/</guid><description>Ghidra&amp;rsquo;s decompiler turns machine code into something that looks like C. But the output is full of strange variable names, weird casts, and functions that look nothing like what you&amp;rsquo;d write. Here&amp;rsquo;s how to read it anyway.</description></item><item><title>Debugging Microservices: Where Did That Request Go?</title><link>https://hanhpp.github.io/posts/debugging-microservices-where-did-that-request-go/</link><pubDate>Sat, 15 Aug 2026 10:30:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/debugging-microservices-where-did-that-request-go/</guid><description>In a monolith, a stack trace tells you what went wrong. In microservices, you&amp;rsquo;re grepping across three services&amp;rsquo; logs at 2 AM trying to figure out which one lost the request. Here&amp;rsquo;s how to make that possible instead of painful.</description></item><item><title>Versioning Microservices Without Breaking Everyone</title><link>https://hanhpp.github.io/posts/microservices-versioning-without-breaking-everyone/</link><pubDate>Thu, 13 Aug 2026 15:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/microservices-versioning-without-breaking-everyone/</guid><description>In a monolith, renaming a field means updating all callers in one commit. In microservices, consumers upgrade on their own schedule, so your API has to evolve without breaking the ones that haven&amp;rsquo;t upgraded yet. Here&amp;rsquo;s how.</description></item><item><title>Running Microservices Locally Without Docker Compose Hell</title><link>https://hanhpp.github.io/posts/microservices-local-dev-without-docker-compose-hell/</link><pubDate>Tue, 11 Aug 2026 10:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/microservices-local-dev-without-docker-compose-hell/</guid><description>You split the monolith into twelve services. Now a new developer&amp;rsquo;s first week is spent getting Docker Compose to run all twelve on their laptop, and half of them crash because of a port conflict. Here&amp;rsquo;s how to make local development work without the pain.</description></item><item><title>Deploying Microservices Without the Fear</title><link>https://hanhpp.github.io/posts/microservices-deploying-without-the-fear/</link><pubDate>Sat, 08 Aug 2026 14:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/microservices-deploying-without-the-fear/</guid><description>In a monolith, deploy means pushing one thing. In microservices, every service deploys independently, which is the whole point, until you realize that &amp;lsquo;independently&amp;rsquo; also means &amp;lsquo;without knowing what the other services are doing right now.&amp;rsquo;</description></item><item><title>Database Per Service: The Pattern That's Harder Than It Sounds</title><link>https://hanhpp.github.io/posts/microservices-database-per-service/</link><pubDate>Thu, 06 Aug 2026 09:30:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/microservices-database-per-service/</guid><description>Each service owns its database. That&amp;rsquo;s the rule. But when a report needs data from four services, or a customer wants to see their complete order history, you&amp;rsquo;ve got a query problem that a single SELECT can&amp;rsquo;t solve. Here&amp;rsquo;s how to handle it.</description></item><item><title>Service Mesh: When You Actually Need One (and When You Don't)</title><link>https://hanhpp.github.io/posts/microservices-service-mesh-when-you-actually-need-one/</link><pubDate>Tue, 04 Aug 2026 11:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/microservices-service-mesh-when-you-actually-need-one/</guid><description>A service mesh gives you mTLS, traffic management, and observability without changing application code. It also gives you another piece of infrastructure to operate, debug, and explain to new hires. Here&amp;rsquo;s how to tell whether the trade-off is worth it.</description></item><item><title>Go Performance Profiling with pprof: Finding the Slow Part</title><link>https://hanhpp.github.io/posts/go-performance-profiling-with-pprof/</link><pubDate>Sat, 01 Aug 2026 10:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/go-performance-profiling-with-pprof/</guid><description>Your Go service is slow, but you don&amp;rsquo;t know where. Guessing is not a strategy. pprof tells you exactly where your program spends its time, memory, and CPU; here&amp;rsquo;s how to use it.</description></item><item><title>The Five Ways Microservices Talk to Each Other</title><link>https://hanhpp.github.io/posts/microservices-five-ways-to-talk/</link><pubDate>Thu, 30 Jul 2026 10:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/microservices-five-ways-to-talk/</guid><description>Before picking REST, gRPC, or Kafka, you need to answer a more basic question: does this interaction block, and does the caller expect an answer? Get that wrong and no technology choice saves you.</description></item><item><title>What Actually Makes a Good Microservice Boundary</title><link>https://hanhpp.github.io/posts/microservices-boundaries-coupling-cohesion/</link><pubDate>Tue, 28 Jul 2026 10:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/microservices-boundaries-coupling-cohesion/</guid><description>Before you draw a single service boundary, you need a vocabulary for why some splits age well and others turn into a distributed monolith. Coupling and cohesion are that vocabulary.</description></item><item><title>Should You Even Use Microservices?</title><link>https://hanhpp.github.io/posts/should-you-even-use-microservices/</link><pubDate>Sat, 25 Jul 2026 10:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/should-you-even-use-microservices/</guid><description>Microservices are a solution to organizational scaling problems, not a technology choice. Here&amp;rsquo;s how to tell whether you actually have the problem they solve, before you pay the cost.</description></item><item><title>About</title><link>https://hanhpp.github.io/about/</link><pubDate>Fri, 24 Jul 2026 00:00:00 +0700</pubDate><guid>https://hanhpp.github.io/about/</guid><description>Who am I and what do I do?</description></item><item><title>Contact</title><link>https://hanhpp.github.io/contact/</link><pubDate>Fri, 24 Jul 2026 00:00:00 +0700</pubDate><guid>https://hanhpp.github.io/contact/</guid><description>Get in touch.</description></item><item><title>Caching Geospatial Queries Without a Specialized Geo Database</title><link>https://hanhpp.github.io/posts/caching-geospatial-queries-without-a-geo-database/</link><pubDate>Thu, 23 Jul 2026 15:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/caching-geospatial-queries-without-a-geo-database/</guid><description>You don&amp;rsquo;t need PostGIS or a geohash library to cache repeat road-distance lookups: rounding coordinates and a unique index gets you most of the win.</description></item><item><title>Self-Hosting a Routing Engine Instead of Paying Per API Call</title><link>https://hanhpp.github.io/posts/self-hosting-a-routing-engine/</link><pubDate>Tue, 21 Jul 2026 14:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/self-hosting-a-routing-engine/</guid><description>Road distance, not straight-line distance, is what travel expense claims and delivery pricing actually need, here&amp;rsquo;s how to get it without a metered maps API.</description></item><item><title>Page Bundles, Images, and Shortcodes</title><link>https://hanhpp.github.io/posts/using-images-and-shortcodes/</link><pubDate>Sat, 18 Jul 2026 11:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/using-images-and-shortcodes/</guid><description>Keeping a post and its images together with Hugo page bundles, plus the built-in figure shortcode.</description></item><item><title>Syntax Highlighting with Hugo</title><link>https://hanhpp.github.io/posts/hugo-code-blocks-demo/</link><pubDate>Thu, 16 Jul 2026 10:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/hugo-code-blocks-demo/</guid><description>Hugo ships with built-in syntax highlighting via Chroma, no plugins required.</description></item><item><title>Welcome to My Blog</title><link>https://hanhpp.github.io/posts/welcome-to-my-blog/</link><pubDate>Tue, 14 Jul 2026 09:00:00 +0700</pubDate><guid>https://hanhpp.github.io/posts/welcome-to-my-blog/</guid><description>A quick hello and a look at how this site is put together.</description></item></channel></rss>