{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Albert BF's Blog",
  "home_page_url": "https://albertbf.com",
  "feed_url": "https://albertbf.com/feed.json",
  "description": "Personal technical blog of Albert Bausili — systems programming, AI engineering, databases, and the occasional deep dive.",
  "language": "en",
  "icon": "https://albertbf.com/images/icon-512.png",
  "favicon": "https://albertbf.com/images/icon-192.png",
  "authors": [
    {
      "name": "Albert Bausili Fernández",
      "url": "https://albertbf.com/about/"
    }
  ],
  "items": [
    {
      "id": "https://albertbf.com/articles/hello-world/",
      "url": "https://albertbf.com/articles/hello-world/",
      "title": "Hello, World — Everything This Blog Can Do",
      "summary": "A grand tour of the rebuilt blog engine: typography, callouts, footnotes, math, diagrams, media, and code you can actually run — right here in the page.",
      "content_html": "<p>This site just went through a complete rebuild, and this article doubles as its living documentation: every feature the engine supports appears somewhere on this page. The <a href=\"https://albertbf.com/articles/hello-world/index.md\">raw Markdown source</a> of this page is served alongside it, so it&#39;s also the reference for how each block is written.</p>\n<h2 id=\"typography-and-prose\">Typography and prose</h2>\n<p>Long-form text is set in Newsreader with a 70-character measure — the sweet spot for sustained reading. Inline styles work as expected: <strong>bold</strong>, <em>italic</em>, <del>strikethrough</del>, <code>inline code</code>, and <a href=\"https://developer.mozilla.org/\">links</a>. Keyboard keys render like <kbd>Ctrl</kbd>+<kbd>K</kbd>.</p>\n<blockquote>\n<p>Regular blockquotes still look like this. Good for quoting people who said smart things.</p>\n</blockquote>\n<p>Lists, of course:</p>\n<ol>\n<li>Ordered lists for sequences</li>\n<li>With proper spacing<ul>\n<li>And nested unordered items</li>\n<li>That align cleanly</li>\n</ul>\n</li>\n</ol>\n<table>\n<thead>\n<tr>\n<th>Feature</th>\n<th>Build-time</th>\n<th>Client JS</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Syntax highlighting</td>\n<td>Shiki</td>\n<td>none</td>\n</tr>\n<tr>\n<td>Math</td>\n<td>KaTeX</td>\n<td>none</td>\n</tr>\n<tr>\n<td>Diagrams</td>\n<td>—</td>\n<td>Mermaid (lazy)</td>\n</tr>\n<tr>\n<td>Running code</td>\n<td>—</td>\n<td>on demand</td>\n</tr>\n</tbody></table>\n<h2 id=\"callouts\">Callouts</h2>\n<div class=\"callout callout--note\" role=\"note\" aria-label=\"Note\">\n<p class=\"callout-title\"><svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"/></svg><span>Note</span></p>\n<p>Five callout types are supported, using GitHub&#39;s blockquote syntax — so they degrade gracefully anywhere else markdown is rendered.</p>\n</div>\n<div class=\"callout callout--tip\" role=\"note\" aria-label=\"Tip\">\n<p class=\"callout-title\"><svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z\"/></svg><span>Tip</span></p>\n<p>Use <code>hl={3-5}</code> on a code fence to highlight lines three through five.</p>\n</div>\n<div class=\"callout callout--important\" role=\"note\" aria-label=\"Important\">\n<p class=\"callout-title\"><svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"/></svg><span>Important</span></p>\n<p>Runnable blocks need complete programs — a Go snippet must be a full <code>package main</code>.</p>\n</div>\n<div class=\"callout callout--warning\" role=\"note\" aria-label=\"Warning\">\n<p class=\"callout-title\"><svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"/></svg><span>Warning</span></p>\n<p>The Go snippets on this page execute on the public Go Playground via a proxy. Don&#39;t paste secrets into things you run.</p>\n</div>\n<div class=\"callout callout--caution\" role=\"note\" aria-label=\"Caution\">\n<p class=\"callout-title\"><svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25a.749.749 0 0 1-.53.22H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"/></svg><span>Caution</span></p>\n<p>JavaScript you run executes in your own browser (sandboxed in a Web Worker). Only run code you understand.</p>\n</div>\n<h2 id=\"footnotes\">Footnotes</h2>\n<p>Footnotes get proper references<sup><a id=\"footnote-ref-1\" href=\"https://albertbf.com/articles/hello-world/#footnote-1\" data-footnote-ref aria-describedby=\"footnote-label\">1</a></sup> with backlinks, and they can contain multiple sentences<sup><a id=\"footnote-ref-2\" href=\"https://albertbf.com/articles/hello-world/#footnote-2\" data-footnote-ref aria-describedby=\"footnote-label\">2</a></sup>.</p>\n<h2 id=\"code-blocks\">Code blocks</h2>\n<p>Code blocks get a header with an optional filename, a language badge, and a copy button. Highlighted lines use fence metadata:</p>\n<div class=\"code-block\" data-lang=\"go\">\n\n<pre class=\"shiki shiki-themes github-light-high-contrast github-dark-high-contrast\" style=\"--shiki-light:#0e1116;--shiki-dark:#f0f3f6;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0a0c10\" tabindex=\"0\"><code><span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">package</span><span style=\"--shiki-light:#702C00;--shiki-dark:#FFB757\"> main</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">import</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\"> \"</span><span style=\"--shiki-light:#702C00;--shiki-dark:#FFB757\">fmt</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line highlighted\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">func</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\"> greet</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">(</span><span style=\"--shiki-light:#702C00;--shiki-dark:#FFB757\">name</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\"> string</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">) </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">string</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">\treturn</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> fmt.</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\">Sprintf</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">(</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">\"Hello, </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">%s</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">!\"</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">, name)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">}</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">func</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\"> main</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">() {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">\tfmt.</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\">Println</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">(</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\">greet</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">(</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">\"world\"</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">))</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">}</span></span></code></pre>\n</div>\n<p>Diffs work with the <code>diff</code> language:</p>\n<div class=\"code-block\" data-lang=\"diff\">\n\n<pre class=\"shiki shiki-themes github-light-high-contrast github-dark-high-contrast\" style=\"--shiki-light:#0e1116;--shiki-dark:#f0f3f6;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0a0c10\" tabindex=\"0\"><code><span class=\"line\"><span style=\"--shiki-light:#6E011A;--shiki-dark:#FFB1AF\">-const theme = localStorage.getItem('theme') || 'light';</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#024C1A;--shiki-dark:#72F088\">+const theme = localStorage.getItem('theme'); // null = follow the system</span></span></code></pre>\n</div>\n<h2 id=\"runnable-code\">Runnable code</h2>\n<p>This is the fun part. Blocks marked <code>run</code> get a <strong>Run</strong> button. Go programs execute on the official Go Playground (proxied through this site&#39;s Worker), and the playground&#39;s event timing is preserved — watch the goroutines interleave:</p>\n<div class=\"code-block\" data-lang=\"go\">\n\n<pre class=\"shiki shiki-themes github-light-high-contrast github-dark-high-contrast\" style=\"--shiki-light:#0e1116;--shiki-dark:#f0f3f6;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0a0c10\" tabindex=\"0\"><code><span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">package</span><span style=\"--shiki-light:#702C00;--shiki-dark:#FFB757\"> main</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">import</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> (</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">\t\"</span><span style=\"--shiki-light:#702C00;--shiki-dark:#FFB757\">fmt</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">\t\"</span><span style=\"--shiki-light:#702C00;--shiki-dark:#FFB757\">time</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">func</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\"> worker</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">(</span><span style=\"--shiki-light:#702C00;--shiki-dark:#FFB757\">id</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\"> int</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">, </span><span style=\"--shiki-light:#702C00;--shiki-dark:#FFB757\">done</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\"> chan&#x3C;-</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\"> string</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">) {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">\ttime.</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\">Sleep</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">(time.</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\">Duration</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">(id) </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">*</span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\"> 300</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\"> *</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> time.Millisecond)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">\tdone </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">&#x3C;-</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> fmt.</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\">Sprintf</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">(</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">\"worker </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">%d</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\"> finished\"</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">, id)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">}</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">func</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\"> main</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">() {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">\tdone </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">:=</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\"> make</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">(</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">chan</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\"> string</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">\tfor</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> i </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">:=</span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\"> 1</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">; i </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">&#x3C;=</span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\"> 3</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">; i</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">++</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">\t\tgo</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\"> worker</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">(i, done)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">\t}</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">\tfor</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> i </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">:=</span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\"> 0</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">; i </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">&#x3C;</span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\"> 3</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">; i</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">++</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">\t\tfmt.</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\">Println</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">(</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">&#x3C;-</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">done)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">\t}</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">}</span></span></code></pre>\n</div>\n<p>SQL runs entirely in your browser — a fresh in-memory SQLite database every time, courtesy of WebAssembly. No server involved:</p>\n<div class=\"code-block\" data-lang=\"sql\">\n\n<pre class=\"shiki shiki-themes github-light-high-contrast github-dark-high-contrast\" style=\"--shiki-light:#0e1116;--shiki-dark:#f0f3f6;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0a0c10\" tabindex=\"0\"><code><span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">CREATE</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\"> TABLE</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\"> langs</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> (</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">name</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\"> TEXT</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">, born </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">INTEGER</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">, systems </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">BOOLEAN</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">);</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">INSERT INTO</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> langs </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">VALUES</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">  (</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">'Go'</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">,   </span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\">2009</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">, </span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\">1</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">),</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">  (</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">'Rust'</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">, </span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\">2010</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">, </span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\">1</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">),</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">  (</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">'SQL'</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">,  </span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\">1974</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">, </span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\">0</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">),</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">  (</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">'Zig'</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">,  </span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\">2016</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">, </span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\">1</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">);</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">SELECT</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\"> name</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">, born </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">FROM</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> langs</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">WHERE</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> systems </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">=</span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\"> 1</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">ORDER BY</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> born;</span></span></code></pre>\n</div>\n<p>JavaScript runs in a sandboxed Web Worker with a five-second watchdog:</p>\n<div class=\"code-block\" data-lang=\"js\">\n\n<pre class=\"shiki shiki-themes github-light-high-contrast github-dark-high-contrast\" style=\"--shiki-light:#0e1116;--shiki-dark:#f0f3f6;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0a0c10\" tabindex=\"0\"><code><span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">const</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\"> fib</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\"> =</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> (</span><span style=\"--shiki-light:#702C00;--shiki-dark:#FFB757\">n</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">) </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">=></span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> n </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">&#x3C;</span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\"> 2</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\"> ?</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> n </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">:</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\"> fib</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">(n </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">-</span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\"> 1</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">) </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">+</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\"> fib</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">(n </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">-</span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\"> 2</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">);</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">for</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> (</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">let</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\"> i </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">=</span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\"> 10</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">; i </span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">&#x3C;=</span><span style=\"--shiki-light:#023B95;--shiki-dark:#91CBFF\"> 14</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">; i</span><span style=\"--shiki-light:#A0111F;--shiki-dark:#FF9492\">++</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">) {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">  console.</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\">log</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">(</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">`fib(${</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">i</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">}) = ${</span><span style=\"--shiki-light:#622CBC;--shiki-dark:#DBB7FF\">fib</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">(</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">i</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">)</span><span style=\"--shiki-light:#032563;--shiki-dark:#ADDCFF\">}`</span><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">);</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#0E1116;--shiki-dark:#F0F3F6\">}</span></span></code></pre>\n</div>\n<p>The static block under each runnable snippet is pre-recorded output — it is what you see if JavaScript is off or the playground is unreachable, and the live output replaces it when you hit Run.</p>\n<h2 id=\"math\">Math</h2>\n<p>Inline math like <span class=\"math math--inline\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>O</mi><mo stretchy=\"false\">(</mo><mi>n</mi><mi>log</mi><mo>⁡</mo><mi>n</mi><mo stretchy=\"false\">)</mo></mrow><annotation encoding=\"application/x-tex\">O(n \\log n)</annotation></semantics></math></span></span></span> flows with the text. Display math gets its own block:</p>\n<div class=\"math math--block\"><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><msubsup><mo>∫</mo><mrow><mo>−</mo><mi mathvariant=\"normal\">∞</mi></mrow><mi mathvariant=\"normal\">∞</mi></msubsup><msup><mi>e</mi><mrow><mo>−</mo><msup><mi>x</mi><mn>2</mn></msup></mrow></msup><mtext> </mtext><mi>d</mi><mi>x</mi><mo>=</mo><msqrt><mi>π</mi></msqrt></mrow><annotation encoding=\"application/x-tex\">\\int_{-\\infty}^{\\infty} e^{-x^2}\\,dx = \\sqrt{\\pi}</annotation></semantics></math></span></span></span></div>\n<p>All rendered at build time — your browser downloads no math JavaScript.</p>\n<h2 id=\"diagrams\">Diagrams</h2>\n<p>Mermaid diagrams are rendered client-side, lazily, and follow the site theme:</p>\n<p><em>[Diagram — <a href=\"https://albertbf.com/articles/hello-world/\">view on the site</a>]</em></p>\n<h2 id=\"media\">Media</h2>\n<p>Images become proper figures with lazy loading and a lightbox — click to zoom:</p>\n<figure class=\"media\"><button type=\"button\" class=\"lightbox-trigger\" aria-label=\"Zoom image: The blog engine&#39;s mascot: a terminal cursor, at rest.\"><img src=\"https://albertbf.com/articles/hello-world/cursor.png\" alt=\"The blog engine&#39;s mascot: a terminal cursor, at rest.\" width=\"1200\" height=\"675\" loading=\"lazy\" decoding=\"async\" data-lightbox></button><figcaption>A blinking terminal cursor on a dark background — the unofficial mascot of this blog.</figcaption></figure>\n<p>YouTube embeds are click-to-load facades: nothing is fetched from Google until you press play.</p>\n<figure class=\"media media--youtube\">\n<button type=\"button\" class=\"youtube-facade\" data-youtube-id=\"dQw4w9WgXcQ\" aria-label=\"Play video: A historically significant video.\">\n<img src=\"https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg\" alt=\"\" width=\"480\" height=\"360\" loading=\"lazy\" decoding=\"async\">\n<span class=\"youtube-play\"><svg width=\"68\" height=\"48\" viewBox=\"0 0 68 48\" aria-hidden=\"true\"><path d=\"M66.52 7.74c-.78-2.93-2.49-5.41-5.42-6.19C55.79.13 34 0 34 0S12.21.13 6.9 1.55c-2.93.78-4.63 3.26-5.42 6.19C.06 13.05 0 24 0 24s.06 10.95 1.48 16.26c.78 2.93 2.49 5.41 5.42 6.19C12.21 47.87 34 48 34 48s21.79-.13 27.1-1.55c2.93-.78 4.64-3.26 5.42-6.19C67.94 34.95 68 24 68 24s-.06-10.95-1.48-16.26z\" fill=\"currentColor\"/><path d=\"M45 24 27 14v20\" fill=\"#fff\"/></svg></span>\n</button><figcaption>A historically significant video.</figcaption></figure>\n<h2 id=\"publishing-mechanics\">Publishing mechanics</h2>\n<p>A few things you can&#39;t see on this page:</p>\n<ul>\n<li><strong>Scheduled publishing</strong> — an article dated in the future is skipped at build time; the daily rebuild publishes it when its day comes.</li>\n<li><strong>Drafts</strong> — <code>draft: true</code> keeps an article out of every build unless you pass <code>--drafts</code>.</li>\n<li><strong>Archiving</strong> — set <code>archived: 2027-01-01</code> and the article gains an archived banner on that date.</li>\n<li><strong>Series</strong> — this article belongs to the <em>Blog Engine</em> series; the navigation below appears automatically.</li>\n</ul>\n<p>That&#39;s the tour. The <a href=\"https://github.com/FumingPower3925/albertbf\">source</a> is public — steal anything you like.</p>\n<section class=\"footnotes\" data-footnotes>\n<h2 id=\"footnote-label\" class=\"sr-only\">Footnotes</h2>\n<ol>\n<li id=\"footnote-1\">\n<p>Like this one. Click the arrow to jump back. <a href=\"https://albertbf.com/articles/hello-world/#footnote-ref-1\" data-footnote-backref aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n<li id=\"footnote-2\">\n<p>This footnote has two sentences. It exists to prove multi-sentence footnotes render correctly. <a href=\"https://albertbf.com/articles/hello-world/#footnote-ref-2\" data-footnote-backref aria-label=\"Back to reference 2\">↩</a></p>\n</li>\n</ol>\n</section>\n",
      "date_published": "2026-07-04T00:00:00.000Z",
      "tags": [
        "meta",
        "go",
        "sql",
        "javascript"
      ]
    }
  ]
}