<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Jaden.log</title><description>A developer blog about what I learn, from concepts I studied to problems I ran into</description><link>https://jaden-log.jhg7856.workers.dev/</link><language>en</language><item><title>How DNS works — why one name lookup sent 8 queries in Kubernetes</title><link>https://jaden-log.jhg7856.workers.dev/en/32/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/32/</guid><description>When code calls http.Get, the name has to become an IP address before any request goes out. That&apos;s DNS&apos;s job. With the same setup as a Kubernetes pod, one name lookup sent 8 queries to a tiny DNS server I wrote to count them.</description><pubDate>Thu, 22 Oct 2026 11:00:00 GMT</pubDate><category>CS</category><category>Fundamentals</category><category>DNS</category><category>resolv.conf</category><category>ndots</category><category>CoreDNS</category><category>TTL</category></item><item><title>Kubernetes on-premises ErrImagePull — pulling an image that&apos;s already there</title><link>https://jaden-log.jhg7856.workers.dev/en/31/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/31/</guid><description>When customers called because an installed service wouldn&apos;t start, the pod was usually in ErrImagePull, sometimes ImagePullBackOff. At first that puzzled me.</description><pubDate>Wed, 21 Oct 2026 02:22:00 GMT</pubDate><category>Infra</category><category>Kubernetes</category><category>ErrImagePull</category><category>ImagePullBackOff</category><category>imagePullPolicy</category><category>containerd</category><category>on-premises</category></item><item><title>Kubernetes requests and limits — who killed it, OOMKilled or Evicted?</title><link>https://jaden-log.jhg7856.workers.dev/en/30/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/30/</guid><description>Writing the GOMEMLIMIT post, I mentioned container memory limits often, but on the Kubernetes side I only knew requests as a floor and limits as a ceiling.</description><pubDate>Mon, 19 Oct 2026 01:25:20 GMT</pubDate><category>Infra</category><category>Kubernetes</category><category>requests</category><category>limits</category><category>OOMKilled</category><category>Evicted</category><category>cgroup</category></item><item><title>AI job search and tailored resumes — jobhunt, a Claude Code and Codex skill</title><link>https://jaden-log.jhg7856.workers.dev/en/29/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/29/</guid><description>While preparing to change jobs, I repeated the same chores every week. I searched job sites, read each posting to judge the fit, and reworked my resume.</description><pubDate>Thu, 08 Oct 2026 06:19:07 GMT</pubDate><category>AI</category><category>AI Tools</category><category>Claude Code</category><category>Codex</category><category>AGENTS.md</category><category>LLM</category><category>resume</category></item><item><title>Go goroutine leaks and pprof — channels, mutexes, and exit paths</title><link>https://jaden-log.jhg7856.workers.dev/en/25/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/25/</guid><description>Starting a goroutine is easy. The hard part was deciding who changes the data, who finishes the work, and when a function may return.</description><pubDate>Tue, 06 Oct 2026 02:21:59 GMT</pubDate><category>Go</category><category>Concepts</category><category>goroutines</category><category>goroutine leak</category><category>pprof</category><category>channels</category><category>mutex</category></item><item><title>Go sync.Pool and buffer reuse — after Put, Bytes() isn&apos;t yours</title><link>https://jaden-log.jhg7856.workers.dev/en/24/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/24/</guid><description>In the previous post, total allocations stayed at 256MiB however I set GOGC and GOMEMLIMIT. Reusing short-lived buffers with sync.Pool is one way to shrink it.</description><pubDate>Tue, 29 Sep 2026 04:12:53 GMT</pubDate><category>Go</category><category>Concepts</category><category>sync.Pool</category><category>bytes.Buffer</category><category>GC</category><category>memory allocation</category></item><item><title>LLM prompting vs RAG vs fine-tuning — weights or input?</title><link>https://jaden-log.jhg7856.workers.dev/en/23/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/23/</guid><description>I spend a good part of every day working with AI, for code and for writing. Yet I couldn&apos;t explain how the model was built, or in what order it computes an answer to what I send it.</description><pubDate>Thu, 24 Sep 2026 06:58:27 GMT</pubDate><category>AI</category><category>Essays</category><category>LLM</category><category>RAG</category><category>fine-tuning</category><category>attention</category><category>KV cache</category></item><item><title>Go GOMEMLIMIT and GOGC — OOMKilled with an 800MB heap</title><link>https://jaden-log.jhg7856.workers.dev/en/22/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/22/</guid><description>The container limit was 1GB, yet the process was OOMKilled with an 800MB heap. Go has a garbage collector, so how did memory run out?</description><pubDate>Mon, 21 Sep 2026 00:46:51 GMT</pubDate><category>Go</category><category>Concepts</category><category>GOMEMLIMIT</category><category>GOGC</category><category>GC</category><category>escape analysis</category><category>OOMKilled</category></item><item><title>Go GMP and GOMAXPROCS — container CPU limits and goroutines</title><link>https://jaden-log.jhg7856.workers.dev/en/21/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/21/</guid><description>Put go in front of a call and it runs concurrently. So do 100,000 goroutines mean 100,000 threads? Does GOMAXPROCS=1 mean one task at a time?</description><pubDate>Fri, 18 Sep 2026 01:08:16 GMT</pubDate><category>Go</category><category>Concepts</category><category>GOMAXPROCS</category><category>goroutines</category><category>scheduler</category><category>cgroup</category></item><item><title>Copying structs in Go — why a shallow copy changes the map too</title><link>https://jaden-log.jhg7856.workers.dev/en/20/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/20/</guid><description>Interfaces, slices, defer, embedding, context: looking back after five posts, most of the pitfalls came from two axes. One is &quot;everything is copied&quot;; the other is &quot;object orientation without classes.&quot;</description><pubDate>Mon, 14 Sep 2026 00:37:56 GMT</pubDate><category>Go</category><category>Concepts</category><category>value copying</category><category>shallow copy</category><category>pure functions</category><category>benchmarks</category></item><item><title>Go ResponseHeaderTimeout — why a one-hour timeout died at 30 seconds</title><link>https://jaden-log.jhg7856.workers.dev/en/19/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/19/</guid><description>I thought putting a one-hour context.WithTimeout on a request meant it would wait up to an hour. It died at 30 seconds. The context made it all the way through; it just wasn&apos;t the only timer. And once I fixed the timer, the real problem turned out to be somewhere else.</description><pubDate>Mon, 07 Sep 2026 05:01:51 GMT</pubDate><category>Go</category><category>Troubleshooting</category><category>HTTP client</category><category>timeouts</category><category>context</category><category>gRPC</category></item><item><title>CockroachDB indexes — why it still read 200,000 rows after I added one</title><link>https://jaden-log.jhg7856.workers.dev/en/18/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/18/</guid><description>A cluster resource list query was slow in internal testing, so I added indexes. Execution time dropped from 233ms to 104ms and I thought it was fixed. Then EXPLAIN ANALYZE showed rows read going from 205,000 to 200,025, barely changed. The numbers didn&apos;t add up.</description><pubDate>Fri, 28 Aug 2026 07:57:03 GMT</pubDate><category>Database</category><category>Troubleshooting</category><category>CockroachDB</category><category>indexes</category><category>query plans</category><category>EXPLAIN ANALYZE</category></item><item><title>On the doubt that grew the more I used AI</title><link>https://jaden-log.jhg7856.workers.dev/en/17/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/17/</guid><description>It&apos;s a tool I use because I like it, yet the more I used it, the more doubt crept in. I only began to understand where that feeling came from after watching one interview.</description><pubDate>Tue, 25 Aug 2026 14:28:21 GMT</pubDate><category>AI</category><category>Essays</category><category>AI</category><category>essay</category><category>motivation</category><category>developer growth</category></item><item><title>Go context, fully explained — cancellation, time budgets, and four pitfalls</title><link>https://jaden-log.jhg7856.workers.dev/en/15/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/15/</guid><description>I was already taking ctx as the first argument and passing it along. What I had never checked was whether canceling actually stops the goroutine. After stalling on that question in an interview, I went back to context from the start.</description><pubDate>Tue, 18 Aug 2026 00:44:45 GMT</pubDate><category>Go</category><category>Concepts</category><category>context</category><category>cancellation</category><category>timeouts</category><category>goroutines</category></item><item><title>From 300 calls to 1 — how I learned that optimization changes failure modes</title><link>https://jaden-log.jhg7856.workers.dev/en/16/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/16/</guid><description>Validation was dying on timeouts. Within 30 minutes I had an answer, &quot;it&apos;s N+1, batch it,&quot; and it was only half right. Reaching the final design took two changes of direction, and since the process taught me more than the code, I&apos;m writing it down.</description><pubDate>Fri, 14 Aug 2026 00:30:19 GMT</pubDate><category>Go</category><category>Troubleshooting</category><category>performance</category><category>N+1</category><category>trade-offs</category><category>design retrospective</category></item><item><title>Why Go has no inheritance — rebuilding OOP with embedding and interfaces</title><link>https://jaden-log.jhg7856.workers.dev/en/14/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/14/</guid><description>Go has no classes and no inheritance, yet it&apos;s hard to call it non-object-oriented. The official FAQ answers &quot;Is Go an object-oriented language?&quot; with &quot;Yes and no.&quot; This post explains why by following what Go put where inheritance used to be.</description><pubDate>Thu, 13 Aug 2026 04:32:33 GMT</pubDate><category>Go</category><category>Concepts</category><category>embedding</category><category>object-oriented programming</category><category>interfaces</category><category>generics</category></item><item><title>Go defer, Errors, and Closures — LIFO, Error Wrapping, and the Loop Variable Trap</title><link>https://jaden-log.jhg7856.workers.dev/en/13/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/13/</guid><description>Go dropped exceptions and filled the gap with defer and errors as values. All three take seconds to learn and keep producing traps for years. I reorganized them around one question: exactly when, and what, does each one hold on to?</description><pubDate>Wed, 12 Aug 2026 06:15:15 GMT</pubDate><category>Go</category><category>Concepts</category><category>defer</category><category>error handling</category><category>closures</category><category>panic</category></item><item><title>Why Go&apos;s append Changes the Original — Inside Slices, Maps, and Strings</title><link>https://jaden-log.jhg7856.workers.dev/en/12/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/12/</guid><description>The Go bugs I keep hitting come from holding something different from what I think I&apos;m holding. A slice is a window, not data. A map doesn&apos;t guarantee addresses. A string isn&apos;t a character array. This post opens up the layout of all three.</description><pubDate>Tue, 11 Aug 2026 04:48:04 GMT</pubDate><category>Go</category><category>Concepts</category><category>slices</category><category>maps</category><category>strings</category><category>Go runtime</category></item><item><title>The Go Interface nil Trap — Why err != nil Is True</title><link>https://jaden-log.jhg7856.workers.dev/en/11/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/11/</guid><description>You return a nil pointer and err != nil comes out true, because an interface value has two slots: a type and the data. From that two-slot layout to method sets, where interfaces should live, and the cost of dynamic dispatch.</description><pubDate>Tue, 11 Aug 2026 04:35:40 GMT</pubDate><category>Go</category><category>Concepts</category><category>interfaces</category><category>nil</category><category>method sets</category><category>Go runtime</category></item><item><title>Normalization, Denormalization, and ORM vs Stored Procedures — DB Design (DB Series 3/4)</title><link>https://jaden-log.jhg7856.workers.dev/en/10/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/10/</guid><description>Part three of the DB series, on design. The anomalies that duplication causes and the first three normal forms, denormalizing only for measured bottlenecks, and whether business logic belongs in an ORM or in stored procedures.</description><pubDate>Mon, 03 Aug 2026 01:55:51 GMT</pubDate><category>Database</category><category>Concepts</category><category>normalization</category><category>denormalization</category><category>ORM</category><category>schema design</category></item><item><title>ACID, Isolation Levels, and Redo/Undo — DB Transactions (DB Series 2/4)</title><link>https://jaden-log.jhg7856.workers.dev/en/9/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/9/</guid><description>Part two of the DB series. ACID is what a transaction promises, isolation levels are the dial that trades isolation for speed, and Redo/Undo is how atomicity and durability survive a crash.</description><pubDate>Mon, 27 Jul 2026 08:27:59 GMT</pubDate><category>Database</category><category>Concepts</category><category>transactions</category><category>isolation levels</category><category>MVCC</category><category>WAL</category></item><item><title>How Static Typing and Compilation Affect Runtime Performance (Through Go)</title><link>https://jaden-log.jhg7856.workers.dev/en/8/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/8/</guid><description>Following how compiled, statically typed code turns into runtime wins, using Go: memory layout, compiler optimizations, escape analysis, the GC, and the scheduler, each checked with tools.</description><pubDate>Thu, 23 Jul 2026 07:04:10 GMT</pubDate><category>Go</category><category>Concepts</category><category>Go runtime</category><category>GC</category><category>performance</category></item><item><title>Optimistic vs Pessimistic Locking, and Deadlocks — DB Concurrency Control (DB Series 1/4)</title><link>https://jaden-log.jhg7856.workers.dev/en/7/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/7/</guid><description>The first post in a database series: deadlocks and livelocks, how to choose between pessimistic and optimistic locking, and an UPDATE without a WHERE that logged out every user.</description><pubDate>Wed, 22 Jul 2026 00:28:14 GMT</pubDate><category>Database</category><category>Concepts</category><category>concurrency</category><category>locking</category><category>MySQL</category></item><item><title>Merging and Sharing a Team CLAUDE.md Through Git (Claude Code)</title><link>https://jaden-log.jhg7856.workers.dev/en/6/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/6/</guid><description>Everyone had a different local CLAUDE.md, so Claude behaved differently on the same codebase. How we merged them into one file in git, slimmed it down, and turned it into a document that grows with every PR.</description><pubDate>Sat, 18 Jul 2026 14:08:23 GMT</pubDate><category>AI</category><category>AI Tools</category><category>Claude Code</category><category>CLAUDE.md</category></item><item><title>5 Token-Saving Tools for Claude Code — RTK vs context-mode</title><link>https://jaden-log.jhg7856.workers.dev/en/5/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/5/</guid><description>I installed Superpowers, agentmemory, context-mode, codebase-memory-mcp, and RTK and sorted them by role. The ones that cut tokens are context-mode and RTK, and they work at different layers.</description><pubDate>Sat, 18 Jul 2026 14:07:44 GMT</pubDate><category>AI</category><category>AI Tools</category><category>Claude Code</category><category>RTK</category><category>context-mode</category></item><item><title>Fixing a Claude Code PreToolUse Hook That Never Registered (RTK)</title><link>https://jaden-log.jhg7856.workers.dev/en/4/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/4/</guid><description>rtk init -g printed a success message, but the PreToolUse hook was never registered. The cause was one leftover comma in settings.json.</description><pubDate>Sat, 18 Jul 2026 14:03:09 GMT</pubDate><category>AI</category><category>AI Tools</category><category>Claude Code</category><category>RTK</category></item><item><title>Concurrency Control Across Multiple Pods: The Single-SQL CAS Pattern</title><link>https://jaden-log.jhg7856.workers.dev/en/3/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/3/</guid><description>Running several pod replicas led two pods to finalize the same job at once. How a single conditional UPDATE, the CAS pattern, stopped the race without a distributed lock.</description><pubDate>Sat, 18 Jul 2026 13:59:00 GMT</pubDate><category>Database</category><category>Troubleshooting</category><category>concurrency</category><category>CAS</category></item><item><title>What Makes Claude Fable Different — It&apos;s Not Just Smarter</title><link>https://jaden-log.jhg7856.workers.dev/en/1/</link><guid isPermaLink="true">https://jaden-log.jhg7856.workers.dev/en/1/</guid><description>Notes from Thariq Shihipar&apos;s Field Guide to Fable talk. With Fable, what decides the result is less the model&apos;s intelligence and more how much of what I don&apos;t know I surface before starting.</description><pubDate>Tue, 14 Jul 2026 08:31:44 GMT</pubDate><category>AI</category><category>Essays</category><category>Claude</category><category>Prompting</category></item></channel></rss>