<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Jeff Bailey</title><link>https://jeffbailey.us/</link><description>This website contains learning resources, opinions, and facts about software-related technology.</description><language>en</language><generator>Hugo</generator><atom:link href="https://jeffbailey.us/rss.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Tue, 06 Oct 2026 00:00:00 +0000</lastBuildDate><item><title>Learn Zsh: Globbing, Expansion, Completion, History, and a Command Reference</title><link>https://jeffbailey.us/blog/2026/10/06/learn-zsh/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/10/06/learn-zsh/</guid><pubDate>Tue, 06 Oct 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Learn X</category><category>Development</category><category>Practice</category><description><![CDATA[<p>Your Mac switched you from bash to zsh, and your <code>~/.zshrc</code> is a few hundred lines pasted from a framework install. Lines such as <code>setopt</code>, <code>bindkey</code>, and <code>zstyle</code> look opaque, and <code>*(om[1])</code> looks like line noise. This guide shows what stock zsh does on its own, with no plugins, so you can read your own config and decide what belongs in it.</p>
<p>It covers the 20% of zsh that does 80% of the work: globbing and glob qualifiers, parameter expansion and arrays, completion, history expansion, options, key bindings, and <code>~/.zshrc</code>. A searchable command reference and a curated set of videos, podcasts, books, and online resources close the article.</p>]]></description></item><item><title>Learn Nushell: Tables, Pipelines, Data Files, and a Command Reference</title><link>https://jeffbailey.us/blog/2026/10/03/learn-nushell/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/10/03/learn-nushell/</guid><pubDate>Sat, 03 Oct 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Learn X</category><category>Development</category><category>Practice</category><description><![CDATA[<p>You pipe JSON from an API into <code>grep</code>, then <code>cut</code>, then <code>awk</code>, and the script breaks the day a field moves. Nushell skips the text parsing. Every command hands the next one a table, a list, or a record, so you filter and sort by column name instead of by character position.</p>
<p>This guide covers the 20% of Nushell that does 80% of the work: tables and pipelines, opening data files, records and lists, finding help, variables, custom commands with <code>def</code>, and your configuration file. A searchable command reference and a curated set of videos, podcasts, books, and online resources close the article.</p>]]></description></item><item><title>What Are AI Evals?</title><link>https://jeffbailey.us/blog/2026/10/01/what-are-ai-evals/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/10/01/what-are-ai-evals/</guid><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>What X</category><category>AI</category><category>Software</category><description><![CDATA[<p>You tweak a prompt, test three questions, and get better answers. A week after shipping it, a customer reports the bot now invents refund policies. No one checked the forty other question types the old prompt handled.</p>
<p>AI evals fill this gap. By the end, you&rsquo;ll know what they measure, why ordinary tests fall short for language model features, and how eval scores can mislead.</p>
<h2 id="what-is-an-ai-eval">What Is an AI Eval?</h2>
<p>An AI eval (short for evaluation) is a repeatable test of how well an AI system performs a specific task. It runs fixed inputs through the system, grades each output against criteria written in advance, and produces a score you can track over time.</p>]]></description></item><item><title>Learn Tmux: Sessions, Windows, Panes, and a Command Reference</title><link>https://jeffbailey.us/blog/2026/09/27/learn-tmux/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/09/27/learn-tmux/</guid><pubDate>Sun, 27 Sep 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Learn X</category><category>Development</category><category>Practice</category><description><![CDATA[<p>You&rsquo;re three commands into a deploy over ssh when the Wi-Fi drops, and the shell dies with it. Or you juggle six terminal tabs and lose track of which one runs the dev server. tmux fixes both: it keeps your shells running on their own, lets you split one terminal into many, and lets you walk away and come back to exactly where you left off.</p>
<p>This guide covers the 20% of tmux that does 80% of the work: sessions, windows, panes, the prefix key, and a small configuration file. A searchable command reference and a curated set of videos, podcasts, books, and online resources close the article.</p>]]></description></item><item><title>jq Cheat Sheet: Filters, Operators, and Output Formats</title><link>https://jeffbailey.us/blog/2026/09/25/jq-cheat-sheet/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/09/25/jq-cheat-sheet/</guid><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Reference</category><category>Command Line</category><category>Developer Tools</category><description><![CDATA[<p>Every entry below is a jq filter, what it returns, and a minimal example. Output shown came from jq 1.8.2.</p>
<p>For the guided version with explanations and larger worked examples, read the <a href="https://jeffbailey.us/blog/2021/11/30/learn-jq/">jq Cookbook</a>.</p>
<h2 id="run-any-entry-here">Run Any Entry Here</h2>
<p>The playground runs real jq 1.8.2 on the same <code>employees.json</code> used throughout this reference. Paste any filter or <code>jq</code> command from the entries below into the command line and press Run.</p>

<script>document.documentElement.classList.add('playground-js');</script>

<div class="jqwp" data-jq-playground data-playground="jq" data-jqwp-version="a26d5dac6b4a14b5cababee97660971b">
  <p class="jqwp-status" role="status" aria-live="polite">Practice the commands on this page in real jq, right here. Nothing downloads until Start (about 360 KB).</p>]]></description></item><item><title>Fix: Too Many Authentication Failures</title><link>https://jeffbailey.us/blog/2026/09/21/ssh-too-many-authentication-failures/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/09/21/ssh-too-many-authentication-failures/</guid><pubDate>Mon, 21 Sep 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Security</category><category>System Administration</category><category>Command Line</category><category>Troubleshooting</category><description><![CDATA[<p>SSH disconnects before you can type a password:</p>
<pre><code class="language-text">Received disconnect from 203.0.113.10 port 22:2: Too many authentication failures
Disconnected from 203.0.113.10 port 22</code></pre><p>You have the right key. The server never got to it. SSH offers every identity it can find, in order, and the server counts each one as a failed attempt. Its default limit is six.</p>
<p>Everything below was reproduced against OpenSSH 10.3 on both ends, with a server left at the default <code>MaxAuthTries</code>.</p>]]></description></item><item><title>Fix: Support for Password Authentication Was Removed</title><link>https://jeffbailey.us/blog/2026/09/21/git-password-authentication-removed/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/09/21/git-password-authentication-removed/</guid><pubDate>Mon, 21 Sep 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Git</category><category>Security</category><category>Command Line</category><category>Troubleshooting</category><description><![CDATA[<p>Your password works when you sign in to github.com, and Git rejects it:</p>
<pre><code class="language-text">remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for &#39;https://github.com/you/your-repo.git/&#39;</code></pre><p>GitHub has since shortened the message. Running the same thing today gives this instead, tested with Git 2.55.0:</p>
<pre><code class="language-text">remote: Invalid username or token. Password authentication is not supported for Git operations.
fatal: Authentication failed for &#39;https://github.com/you/your-repo.git/&#39;</code></pre><p>Both mean one thing: the account password is not a Git credential and has not been since 13 August 2021. You need either an SSH key or a personal access token. Nothing is wrong with your account.</p>]]></description></item><item><title>Fix: ssh: connect to host github.com port 22: Connection timed out</title><link>https://jeffbailey.us/blog/2026/09/21/ssh-connect-to-host-github-port-22/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/09/21/ssh-connect-to-host-github-port-22/</guid><pubDate>Mon, 21 Sep 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Git</category><category>Networking</category><category>Command Line</category><category>Troubleshooting</category><description><![CDATA[<p>Git hangs for a while, then gives up:</p>
<pre><code class="language-text">ssh: connect to host github.com port 22: Connection timed out
fatal: Could not read from remote repository.</code></pre><p>Your key is not the problem. The connection never got far enough to offer one. Something between you and GitHub is dropping traffic on port 22, which is normal on corporate networks, many hotel and airport networks, and some mobile hotspots.</p>
<p>GitHub publishes an SSH endpoint on port 443 for exactly this. Everything below was tested with OpenSSH 10.3 and Git 2.55.0.</p>]]></description></item><item><title>Structurizr vs Mermaid vs PlantUML for C4 Diagrams</title><link>https://jeffbailey.us/blog/2026/09/20/structurizr-vs-mermaid-vs-plantuml/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/09/20/structurizr-vs-mermaid-vs-plantuml/</guid><pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Comparison</category><category>Software Architecture</category><category>Developer Tools</category><description><![CDATA[<p>Three tools draw <a href="https://c4model.com/">C4 diagrams</a> from text, and picking between them looks like a taste question about syntax. It is mostly a question about what you want to keep: a picture, or a model that can produce pictures.</p>
<p>Everything below was run on one system modeled three ways, with Structurizr 2026.09.19 (structurizr-* 6.2.3), Mermaid CLI 11.17.0 on mermaid 11.17.2, and PlantUML 1.2026.8 on Graphviz 16.1.0.</p>
<h2 id="the-short-answer">The short answer</h2>
<div class="card-grid" style="--min-width: 250px;"><div class="card"><strong>Reach for Structurizr</strong>
When the same system needs more than one diagram. You describe the model once and generate every view from it, so a renamed container changes in one place.</div><div class="card"><strong>Reach for Mermaid</strong>
When the diagram must render where it lives, in a README or a wiki, with no build step and no renderer to install.</div><div class="card"><strong>Reach for PlantUML</strong>
When layout quality matters most. Graphviz routes edges around boxes, and no other option here does.</div></div><style>
  .card-grid {
    display: grid;
    gap: 1rem;
    margin: 1.5rem 0;
    grid-template-columns: repeat(auto-fit, minmax(var(--min-width), 1fr));
  }

  .card-grid .card>strong:first-child,
  .card-grid .card>h1:first-child,
  .card-grid .card>h2:first-child,
  .card-grid .card>h3:first-child,
  .card-grid .card>h4:first-child,
  .card-grid .card>h5:first-child,
  .card-grid .card>h6:first-child {
    font-size: 1.1em;
    display: block;
    margin-bottom: 0.75rem;
    margin-top: 0;
    color: var(--text-color);
  }

  .card-grid .card {
    color: var(--text-color);
    background-color: var(--background-color);
    border: 2px solid var(--border-color, #e0e0e0);
    border-radius: 8px;
    padding: 1.25rem;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  }

   
  .blog-card {
    display: flex;
    flex-direction: column;
    transition: transform 0.2s ease, box-shadow 0.2s ease;
  }

  .blog-card:hover {
    transform: translateY(-2px);
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
  }

  .blog-card-header {
    display: flex;
    flex-direction: column;
    align-items: left;
    gap: 1rem;
    margin-bottom: 0.75rem;
  }

  .blog-logo {
    object-fit: contain;
    flex-shrink: 0;
    border-radius: 4px;
    background: var(--background-color);
    padding: 4px;
  }

  .blog-logo.blog-logo-sized {
    box-sizing: border-box;
  }

  .blog-logo-sized {
    width: var(--logo-size, 64px);
    height: var(--logo-size, 64px);
    max-width: var(--logo-size, 64px);
    max-height: var(--logo-size, 64px);
  }

  .blog-title {
    margin: 0;
    font-size: 1.1em;
    text-align: center;
  }

  .blog-title a {
    color: var(--text-color);
    text-decoration: none;
  }

  .blog-title a:hover {
    text-decoration: underline;
  }

  .blog-description {
    margin: 0 0 1rem 0;
    color: var(--text-color);
    opacity: 0.9;
    line-height: 1.5;
    flex: 1;
  }

  .blog-card-items {
    margin: 0;
    padding-left: 1.25rem;
    color: var(--text-color);
    line-height: 1.5;
    flex: 1;
  }

  .blog-card-items li {
    margin-bottom: 0.25rem;
  }

  .blog-links {
    display: flex;
    align-items: center;
    gap: 1rem;
    margin-top: auto;
  }

  .blog-link {
    color: var(--link-color, #0066cc);
    text-decoration: none;
    font-weight: 500;
    display: inline-block;
  }

  .blog-link:hover {
    text-decoration: underline;
  }

   
  .searchable-blog-cards {
    margin: 1.5rem 0;
  }

  .searchable-blog-cards .blog-cards-search-input {
    display: block;
    width: 100%;
    max-width: 24rem;
    margin-bottom: 1rem;
    padding: 0.5rem 0.75rem;
    font-size: 1rem;
    border: 2px solid var(--border-color, #e0e0e0);
    border-radius: 6px;
    background: var(--background-color);
    color: var(--text-color);
  }

  .searchable-blog-cards .blog-cards-search-input:focus {
    outline: none;
    border-color: var(--link-color, #0066cc);
  }

  .searchable-blog-cards .blog-card.hidden {
    display: none;
  }

  .visually-hidden {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
  }
</style>

<p>These are not three competitors for one slot. Structurizr exports PlantUML and Mermaid, so the real choice is whether you keep a model upstream of whichever renderer you already use.</p>]]></description></item><item><title>jq vs yq: Which One Should You Use?</title><link>https://jeffbailey.us/blog/2026/09/20/jq-vs-yq/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/09/20/jq-vs-yq/</guid><pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Comparison</category><category>Command Line</category><category>Developer Tools</category><description><![CDATA[<p>Both tools filter structured data with a similar language, so the question looks like a choice. It usually isn&rsquo;t. jq reads JSON; yq reads YAML and four other formats, and writes them back with your comments intact. Most people end up with both installed.</p>
<p>This compares them where they actually differ: file formats, syntax compatibility, in-place editing, and speed. Everything below was run with jq 1.8.2 and yq v4.53.6 (the Go one) on the same files.</p>]]></description></item><item><title>How to Use jq With kubectl: Practical Recipes</title><link>https://jeffbailey.us/blog/2026/09/20/how-do-i-use-jq-with-kubectl/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/09/20/how-do-i-use-jq-with-kubectl/</guid><pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>How To</category><category>Command Line</category><category>Containers</category><description><![CDATA[<p><code>kubectl get pods</code> answers the easy questions. The moment you need something it has no column for, which containers have no memory limit, which images the cluster actually runs, which pods restarted most, you reach for <code>-o json</code> and a filter.</p>
<p>These recipes ran against a live two-node k3s cluster (Kubernetes 1.35) with jq 1.8.2, including a deliberately broken deployment so the failure output is real. Swap the namespaces for yours.</p>]]></description></item><item><title>Fix: src refspec main does not match any</title><link>https://jeffbailey.us/blog/2026/09/20/git-src-refspec-does-not-match-any/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/09/20/git-src-refspec-does-not-match-any/</guid><pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Git</category><category>Command Line</category><category>Developer Tools</category><description><![CDATA[<p>You created the repository, added the remote, ran the push, and Git answered with this:</p>
<pre><code class="language-text">error: src refspec main does not match any
error: failed to push some refs to &#39;git@github.com:you/your-repo.git&#39;</code></pre><p>The message is about your machine, not the server. <code>git push origin main</code> asks Git to send a local branch named <code>main</code>, and Git is saying no such branch exists here. Four things cause that, and the first two account for most of it. All output below came from Git 2.55.</p>]]></description></item><item><title>Fix: Host Key Verification Failed</title><link>https://jeffbailey.us/blog/2026/09/20/ssh-host-key-verification-failed/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/09/20/ssh-host-key-verification-failed/</guid><pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Security</category><category>System Administration</category><category>Command Line</category><description><![CDATA[<p>SSH refuses to connect and prints one of two things. They look similar and mean different things, so read yours before you change anything.</p>
<pre><code class="language-text">Host key verification failed.</code></pre><p>The line above it is the one that matters. This guide covers both forms, tested with OpenSSH 10.3.</p>
<h2 id="which-message-did-you-get">Which Message Did You Get?</h2>
<h3 id="the-host-is-unknown">The host is unknown</h3>
<pre><code class="language-text">No ED25519 host key is known for github.com and you have requested strict checking.
Host key verification failed.</code></pre><p>You&rsquo;ve never connected to this host, and <code>StrictHostKeyChecking=yes</code> refuses to accept a key it hasn&rsquo;t seen. Routine. Go to &ldquo;Add a host key you trust&rdquo;.</p>]]></description></item><item><title>About</title><link>https://jeffbailey.us/about/</link><guid isPermaLink="true">https://jeffbailey.us/about/</guid><pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><description><![CDATA[<p>I&rsquo;m Jeff Bailey, a principal software engineer. I&rsquo;ve worked at <a href="https://www.nike.com/">Nike</a> since 2019, first on the product customization platform and now on tech modernization and platform work: enterprise architecture, cloud cost optimization, and the InnerSource and open source practices that let teams share code instead of rebuilding it.</p>
<p>I&rsquo;m a <a href="https://www.credly.com/badges/9ccf3d71-3e0c-4491-819f-a6e1e71305f2/linked_in?t=st6qaz">FinOps Certified Practitioner</a> and a board member at <a href="https://innersourcecommons.org/">InnerSource Commons</a>. Before Nike I consulted for clients across retail, healthcare, and construction software. I&rsquo;ve been writing code since the start of my career in the 90s, back through Earthlink and the early web. The full history is on my <a href="https://jeffbailey.us/resume/">resume</a>.</p>]]></description></item><item><title>Confusion as a Service - Deadly Cut 17</title><link>https://jeffbailey.us/blog/2026/09/03/death-by-1000-cuts-17-confusion-as-a-service/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/09/03/death-by-1000-cuts-17-confusion-as-a-service/</guid><pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Death By 1000 Cuts</category><category>Culture</category><description><![CDATA[<p>Have you ever worked with someone who leaves confusion everywhere they go? You are having a level-headed conversation about something simple, work is moving, and then they arrive. What follows is <em><strong>Confusion as a Service (CaaS)</strong></em>: a relentless focus on things that do not matter in any universe.</p>
<p>Before they show up, my mind sits in a tranquil pool. The reality I am working in is distilled and full of purpose, and I am making real strides toward the goal.</p>]]></description></item><item><title>Why Do I Need an Ontology?</title><link>https://jeffbailey.us/blog/2026/08/26/why-do-i-need-an-ontology/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/08/26/why-do-i-need-an-ontology/</guid><pubDate>Wed, 26 Aug 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Why</category><category>AI</category><category>Software Engineering</category><description><![CDATA[<h2 id="introduction">Introduction</h2>
<p>Imagine an AI that approves a second refund on the same order. Its reasoning is clear, and the tool call is correct. Yet, the refund remains wrong, and system knowledge isn&rsquo;t enough to stop it, since the rule &ldquo;one order gets one refund&rdquo; exists only in someone&rsquo;s mind.</p>
<p>That rule belongs in an ontology. By the end of this article, you&rsquo;ll understand what an ontology is, why developers have always needed one, and why agents and LLMs need a robust one more than ever.</p>]]></description></item><item><title>What Is Lima?</title><link>https://jeffbailey.us/blog/2026/01/31/what-is-lima/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/01/31/what-is-lima/</guid><pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>What X</category><category>Containers</category><category>macOS</category><category>Development</category><description><![CDATA[<p>When Docker altered Docker Desktop licensing in 2021, teams received emails from procurement to stop using it or buy seats. Switching a Mac to Lima after such emails, the command line remains nearly unchanged. Containers run, ports forward, and bind mounts appear inside the container.</p>
<p>That leaves a question: what is doing the work now? Docker Desktop feels like one thing. Lima seems like tangled parts.</p>
<p>This article explains what Lima is, how it runs Linux on your Mac, and its relation to tools like <code>nerdctl</code>, Colima, and Rancher Desktop.</p>]]></description></item><item><title>Learn Mermaid</title><link>https://jeffbailey.us/blog/2026/08/14/learn-mermaid/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/08/14/learn-mermaid/</guid><pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Learn X</category><category>Software</category><category>Developer Tools</category><description><![CDATA[<p><strong>Quick Start:</strong> This guide gets you writing Mermaid diagrams that render on GitHub in about 15 minutes. Learn the two diagram types that cover most real work, then build a deployment pipeline diagram you can drop into any README.</p>
<h2 id="what-youll-learn">What You&rsquo;ll Learn</h2>
<ul>
<li>What is Mermaid, and what problem does it solve?</li>
<li>What are the use cases for Mermaid?</li>
<li>When is Mermaid <em>not</em> the right tool?</li>
<li>Which two diagram types cover most real work?</li>
<li>How do you build a pipeline diagram and publish it on GitHub?</li>
<li>Where can you go to learn more about Mermaid?</li>
</ul>
<h2 id="the-basics">The Basics</h2>
<p><a href="https://mermaid.js.org/">Mermaid</a> is an open-source tool that turns short text descriptions into diagrams. Type <code>A --&gt; B</code> and you get two boxes connected by an arrow. Knut Sveidqvist created it in 2014 so diagrams could live where code lives: in plain text, in version control, reviewed in pull requests like everything else.</p>]]></description></item><item><title>How Do I Use Lima?</title><link>https://jeffbailey.us/blog/2026/08/14/how-do-i-use-lima/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/08/14/how-do-i-use-lima/</guid><pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Containers</category><category>macOS</category><category>Developer Tools</category><description><![CDATA[<p>Lima enables you to run a Linux machine on your Mac for free. This tutorial helps you install Lima, launch a Linux VM, verify shared files, and run a web server in a container accessible via your browser.</p>
<p>If you want the concepts first, read <a href="https://jeffbailey.us/blog/2026/01/31/what-is-lima/">What Is Lima?</a> and come back. This article stays hands-on.</p>
<h2 id="what-youll-build">What You&rsquo;ll Build</h2>
<p>A working Lima setup: an Ubuntu virtual machine (VM) running on your Mac, managed from your terminal, serving a containerized nginx web page at <code>localhost:8080</code>.</p>]]></description></item><item><title>What Is Envoy?</title><link>https://jeffbailey.us/blog/2026/08/13/what-is-envoy/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/08/13/what-is-envoy/</guid><pubDate>Thu, 13 Aug 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>What X</category><category>DevOps</category><category>Software Architecture</category><description><![CDATA[<p>Run <code>kubectl get pods</code> in a Kubernetes cluster with Istio installed, and every application pod shows <code>2/2</code> containers. You deployed one container. The second is Envoy, and it now handles every byte of network traffic your application sends or receives.</p>
<p>Envoy is an open-source, high-performance proxy for cloud-native systems. It handles networking tasks like routing, retries, timeouts, load balancing, encryption, and telemetry, replacing application-managed functions. By the end of this article, you&rsquo;ll understand why Envoy exists, how its configuration works, and why Kubernetes tools such as Istio, Envoy Gateway, Contour, and Emissary build on it.</p>]]></description></item><item><title>What Is Boolean Logic?</title><link>https://jeffbailey.us/blog/2026/07/29/what-is-boolean-logic/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/07/29/what-is-boolean-logic/</guid><pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>What X</category><category>Programming</category><category>Software Engineering</category><description><![CDATA[<h2 id="introduction">Introduction</h2>
<p>Every <code>if</code> statement relies on ideas humans learn before talking. Booleans seem simple: one bit, two values. But explaining a boolean to someone with no programming background is difficult.</p>
<p>Boolean logic is a reasoning system based on two values, true and false, with three operations: AND, OR, NOT. It underpins all digital computers and program conditionals.</p>
<p>By the end of this article, you&rsquo;ll understand Boolean logic, its purpose, how it works, and the mental patterns humans need before &ldquo;true&rdquo; and &ldquo;false&rdquo; mean anything.</p>]]></description></item><item><title>The Invalid Response Loop: Deadly Cut 16</title><link>https://jeffbailey.us/blog/2026/07/24/death-by-1000-invalid-response-loop/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/07/24/death-by-1000-invalid-response-loop/</guid><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Death By 1000 Cuts</category><category>Software</category><category>Culture</category><category>Customer Experience</category><description><![CDATA[<p>I just got off a 27-minute call trying to understand and fix a credit card decline problem with my Flexible Spending Account (FSA), not to be confused with my Health Savings Account (HSA). Thank you, government, for creating two accounts that sound very similar. It was a wonderful adventure.</p>
<p>If I were playing a game of Zork, it might have been fun pressing 1, 2, 3, or 4, or entering random words to get to the next level, but I wasn&rsquo;t playing Zork. I was just trying to fix a declined credit card transaction. Every time I get a phone number and no other option, no email, no chat, I know I&rsquo;m doomed. I expect to be jerked around for a minimum of 30 to 60 minutes and eventually end up in a purgatory loop where I&rsquo;m expected to know the magic incantation I must cast to reach the secret department.</p>]]></description></item><item><title>Fundamentals of Containerization</title><link>https://jeffbailey.us/blog/2026/07/19/fundamentals-of-containerization/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/07/19/fundamentals-of-containerization/</guid><pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Fundamentals</category><category>Software Engineering</category><category>DevOps</category><description><![CDATA[<h2 id="introduction">Introduction</h2>
<p>Why does &ldquo;it works on my machine&rdquo; stop being an excuse the moment a team adopts containers? Because a container ships the machine along with the code. That single shift, packaging an application together with everything it needs to run, is the heart of containerization.</p>
<p>A container is an isolated process that carries its own filesystem, libraries, and configuration while sharing the host operating system kernel. The application sees a clean, predictable world. The host sees just another process it can start, stop, and limit.</p>]]></description></item><item><title>Fundamentals of Empirical Software Engineering</title><link>https://jeffbailey.us/blog/2026/07/14/fundamentals-of-empirical-engineering/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/07/14/fundamentals-of-empirical-engineering/</guid><pubDate>Tue, 14 Jul 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Fundamentals</category><category>Software Engineering</category><category>Data Science</category><description><![CDATA[<p>Most claims about how to build software are opinions wearing the costume of fact. &ldquo;Pair programming catches more bugs.&rdquo; &ldquo;Microservices scale better.&rdquo; &ldquo;This linter improves quality.&rdquo; Each sounds authoritative, and each is testable. Empirical software engineering is the discipline that does the testing: it studies how software is built, maintained, and used by collecting real data and analyzing it, instead of trusting whoever argues most confidently.</p>
<p>Think of it like the shift medicine made a century ago. Doctors once prescribed treatments because a respected mentor swore by them. Then medicine started running trials, tracking outcomes, and pooling results across studies. Software engineering is partway through the same shift, and understanding how it works lets you tell a real finding from a well-dressed guess.</p>]]></description></item><item><title>Fundamentals of Data Architecture</title><link>https://jeffbailey.us/blog/2026/07/13/fundamentals-of-data-architecture/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/07/13/fundamentals-of-data-architecture/</guid><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Fundamentals</category><category>Data Engineering</category><category>Data Architecture</category><description><![CDATA[<h2 id="introduction">Introduction</h2>
<p>Someone on r/dataengineering asked if there&rsquo;s a standard for modern data architecture. With 20 years of experience, they had a batch pipeline pulling 200MB files into a data lake and a new source as a serialized Kafka stream. They wondered if streaming was the new paradigm or if they were becoming dinosaurs.</p>
<p>The best answer cut to the confusion: the question asked about architecture, but the follow-up discussed tools. They are on different levels. Data architecture has little to do with tool selection.</p>]]></description></item><item><title>Fundamentals of Architecture Decision Making</title><link>https://jeffbailey.us/blog/2026/07/13/fundamentals-of-architecture-decision-making/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/07/13/fundamentals-of-architecture-decision-making/</guid><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Fundamentals</category><category>Software Architecture</category><category>System Design</category><description><![CDATA[<h2 id="introduction">Introduction</h2>
<p>A team spends three weeks debating whether to use PostgreSQL or MongoDB. Six months later, nobody remembers why they chose one over the other, a new hire proposes switching, and the whole argument starts again from zero. The database was never the hard part. The team had no way to make the decision, agree on it, and remember it.</p>
<p>Most software failures are not coding failures. They trace back to an undocumented decision made without considering key forces, by the wrong people, or both. Architecture decision-making is the discipline of choosing well when the choice is hard to reverse.</p>]]></description></item><item><title>Fundamentals of Analytics Engineering</title><link>https://jeffbailey.us/blog/2026/07/09/fundamentals-of-analytics-engineering/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/07/09/fundamentals-of-analytics-engineering/</guid><pubDate>Thu, 09 Jul 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Fundamentals</category><category>Data Engineering</category><category>Analytics Engineering</category><description><![CDATA[<h2 id="introduction">Introduction</h2>
<p>Most data teams hit the same wall. The pipelines run, the warehouse fills up, and yet nobody trusts the numbers. Two dashboards report different revenue. An analyst spends a morning rebuilding a definition of &ldquo;active user&rdquo; that someone already wrote last quarter. The data exists, but the data nobody argues about does not.</p>
<p>Analytics engineering is the work that closes that gap. It sits between the people who move data and the people who interpret it, and it owns the messy middle where raw tables become datasets you can trust.</p>]]></description></item><item><title>Are We There Yet Development</title><link>https://jeffbailey.us/blog/2026/07/02/death-by-1000-are-we-there-yet-development/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/07/02/death-by-1000-are-we-there-yet-development/</guid><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Software Engineering</category><category>AI</category><description><![CDATA[<p>A new paradigm is emerging in the age of AI-led software development. I&rsquo;m calling it <em><strong>Are We There Yet Development</strong></em>. Last week a developer walked over to another developer asking for something they felt they needed to proceed with their <em><strong>critical</strong></em> greenfield project when the developer was in the middle of troubleshooting a production incident.</p>
<p>Looming over nearly every developer is a neverending sense of urgency from on high and an enduring belief that using AI means building at the speed of thought. As this cultural &ldquo;norm&rdquo; seeps into the software development lifecycle I can&rsquo;t help but think about children in the back of the car whining for the hundredth time: <em>&ldquo;Are we there yet?!&rdquo;</em>.</p>]]></description></item><item><title>Learn HTTP Status Codes</title><link>https://jeffbailey.us/blog/2026/06/28/learn-http-codes/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/06/28/learn-http-codes/</guid><pubDate>Sun, 28 Jun 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>Learn X</category><category>Web Development</category><description><![CDATA[<p><strong>Quick Start:</strong> Learn five mental models that cover every HTTP response, then read live codes with <code>curl</code>. Total time: 20 minutes.</p>
<h2 id="what-youll-learn">What You&rsquo;ll Learn</h2>
<ul>
<li>What an HTTP status code is, and what problem it solves.</li>
<li>Five mental models that make any code readable, not just the ones you&rsquo;ve memorized.</li>
<li>The mnemonic for all five classes, and four more models for the hard cases.</li>
<li>The handful of codes you&rsquo;ll meet 95% of the time.</li>
<li>When the code lies to you (200 with an error inside).</li>
<li>How to read status codes yourself with <code>curl</code>.</li>
<li>Where to go to learn the long tail.</li>
</ul>
<h2 id="the-basics">The Basics</h2>
<p>Every HTTP response carries a three-digit status code: the server&rsquo;s verdict on your request, delivered before any body content. The first digit classifies responses into five categories; knowing those five is enough to read any code you encounter.</p>]]></description></item><item><title>1000 Life Giving Potions - Operating System Wildlife</title><link>https://jeffbailey.us/blog/2026/06/27/1000-life-giving-potions-operating-system-wildlife/</link><guid isPermaLink="true">https://jeffbailey.us/blog/2026/06/27/1000-life-giving-potions-operating-system-wildlife/</guid><pubDate>Sat, 27 Jun 2026 00:00:00 +0000</pubDate><dc:creator>Jeff Bailey</dc:creator><category>1000 Life Giving Potions</category><category>Operating Systems</category><category>Software Engineering</category><description><![CDATA[<p>I admit it: I&rsquo;m an operating system addict. I&rsquo;ve installed countless operating systems over my life, and I still use many of them. It may seem like a bad idea. It isn&rsquo;t.</p>
<p>I jump between macOS, Linux, Windows, and Chrome OS across many devices, and that&rsquo;s just on desktop. On phones, my first was a Google Nexus One then a couple pit stops with Nokia Lumia 521 and 620 Windows Phones. Later I went back to Adroid with a Samsung S7, an S10, and others, I now carry an iPhone 13 Pro Max. I&rsquo;ve also used long-dead operating systems like SunOS, Solaris, Warp OS, and many more. Oh, and I run Android TV on an Nvidia Shield and don&rsquo;t forget three different Raspberry Pis and a Synology NAS all running various flavors of Linux.</p>]]></description></item></channel></rss>