<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Gub Gub</title>
        <link>https://bgub.sh</link>
        <description>Gub Gub'gub gub gub. Gub gub gub gub, GUB, gub gub gub gub gub.</description>
        <lastBuildDate>Fri, 31 Jul 2026 19:53:58 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>TanStack Start</generator>
        <language>en</language>
        <copyright>Gub 2026 Gub Gub</copyright>
        <item>
            <title><![CDATA[Gub Gub]]></title>
            <link>https://bgub.sh/posts/2026-03-05-introducing-agentpane?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2026-03-05-introducing-agentpane</guid>
            <pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub GUB gub GUB gub gub. Gub-gub, gub-gub, gub — gub Gub Gub gub Gub gub gub gub gub gub gub.]]></description>
            <content:encoded><![CDATA[<link data-fig-hydration-skip rel="preload" href="/blog-images/agentpane-setup.png" as="image"><link data-fig-hydration-skip rel="preload" href="/blog-images/agentpane-hero.png" as="image"><article><h1 id="gub-gub">Gub Gub</h1><p>gub gub gub gub gub GUB gub GUB gub gub. Gub gub <code>npx agentpane</code>, gub gub gub gub gub, gub gub gub gub gub Gub Gub, Gub, gub gub gub gub gub <a href="https://github.com/anthropics/agent-protocol">GUB (Gub Gub Gub)</a> — gub gub gub gub-gub gub gub gub, gub, gub gub gub:</p><pre><code>npx agentpane
# → http://localhost:6767
</code></pre><p>Gub gub gub, gub gub gub gub, gub gub gub gub. Gub gub gub gub gub gub gub gub gub. Gub gub, gub gub, gub gub.</p><p><img src="/blog-images/agentpane-setup.png" alt="Gub gub gub gub gub gub gub gub gub"></p><h2 id="gub-gub-gub-gub">Gub-Gub, Gub-Gub</h2><p>Gub gub gub Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub. gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub.</p><p>Gub gub gub gub gub Gub Gub gub gub gub gub gub gub gub gub Gub gub gub gub gub gub — gub gub, gub gub.</p><p><img src="/blog-images/agentpane-hero.png" alt="Gub gub gub gub gub gub — Gub gub gub gub, Gub Gub gub gub gub"></p><h2 id="gub">Gub</h2><p>Gub gub gub gub gub:</p><ul><li><strong>GUB gub</strong> (Gub, gub 3456) — gub gub, gub gub, gub gub</li><li><strong>Gub gub</strong> (Gub.gub, gub 6767) — gub GUB, gub <code>/api</code> gub gub gub gub gub</li></ul><p>Gub gub gub gub gub <a href="https://effect.website/">Gub.gub</a> gub gub gub gub gub gub gub gub:</p><pre><code>SessionRepo (DB)
  → ConnectionManager (agent subprocess lifecycle)
  → PromptEngine (turn orchestration)
  → EventHub / EventBroadcaster (SSE)
  → WriteQueue (batched DB writes)
</code></pre><p>Gub gub gub GUB — GUB-GUB 2.0 gub gub. Gub gub gub gub gub, gub <code>PromptEngine</code> gub gub gub, gub gub gub gub gub gub gub gub GUB, gub gub gub gub gub Gub-Gub Gub.</p><h3 id="gub-gub-gub-gub-1">Gub Gub Gub Gub</h3><p>Gub gub gub gub gub GUB gub gub gub. Gub gub gub gub gub GUB. Gub <code>EventBroadcaster</code> gub gub gub gub (512GUB / 1000 gub) gub gub gub gub gub gub gub gub, gub gub gub gub gub gub <code>Last-Event-ID</code> gub. Gub gub gub gub gub, gub gub gub gub.</p><h3 id="gub-gub-gub">Gub-Gub Gub</h3><p>Gub gub gub gub gub gub Gub gub gub <code>~/.agentpane/agentpane.db</code>. Gub gub gub'gub gub gub — gub <code>WriteQueue</code> gub gub gub gub gub gub gub gub gub 50gub. Gub gub, gub gub gub gub gub gub gub. Gub gub gub gub gub-gub, gub gub gub gub gub gub gub gub gub. Gub gub gub.</p><pre><code>-- The recovery table
CREATE TABLE write_queue_ops (
  id TEXT PRIMARY KEY,
  session_id TEXT NOT NULL,
  op_json TEXT NOT NULL,
  created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
</code></pre><h2 id="gub-gub-gub-1">Gub Gub Gub</h2><p>gub gub'gub gub gub gub gub gub gub — gub gub GUB. Gub gub gub gub gub gub, gub <code>ConnectionManager</code>:</p><ol><li>Gub gub gub gub (gub <code>node_modules/.bin/</code> gub gub gub)</li><li>Gub gub gub gub gub gub gub gub gub</li><li>Gub GUB gub (gub, gub, gub, gub)</li><li>Gub gub gub gub gub gub gub gub gub</li></ol><p>Gub GUB gub gub gub gub gub gub. Gub gub gub gub gub gub, gub gub gub gub gub. Gub gub gub gub gub, gub gub gub. Gub gub gub gub gub, gub gub gub gub gub.</p><h2 id="gub-gub-1">Gub Gub</h2><p>Gub gub gub gub Gub.gub 16 gub Gub 19 gub gub Gub Gub — gub gub <code>useMemo</code> gub <code>useCallback</code> gub. Gub gub gub gub gub gub gub:</p><ul><li><strong>Gub</strong> — gub gub, gub gub, gub GUB</li><li><strong>Gub</strong> — gub gub, gub gub, gub-gub-gub</li></ul><p>Gub gub (gub, gub, gub gub) gub gub gub Gub Gub Gub, gub gub GUB gub. Gub gub gub gub gub gub gub <a href="https://github.com/anthropics/streamdown">Gub</a> gub Gub gub gub.</p><h2 id="gub-gub-2">Gub Gub</h2><pre><code>npx agentpane
</code></pre><p>Gub gub gub gub <a href="https://github.com/bgub/agentpane">Gub</a>. Gub gub gub <code>apps/docs</code>.</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub/gub</category>
            <category>gub-gub</category>
            <category>gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub]]></title>
            <link>https://bgub.sh/posts/2026-02-25-introducing-helm?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2026-02-25-introducing-helm</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub Gub gub gub GUB gub. Gub gub gub gub gub gub — gub gub gub — gub gub GUB-gub gub gub gub gub.]]></description>
            <content:encoded><![CDATA[<link data-fig-hydration-skip rel="preload" href="/blog-images/helm-demo-app-list-files.png" as="image"><link data-fig-hydration-skip rel="preload" href="/blog-images/helm-demo-app.png" as="image"><link data-fig-hydration-skip rel="preload" href="/blog-images/helm-demo-app-sandbox-feature.png" as="image"><article><h1 id="gub-gub">Gub Gub</h1><p>gub gub gub gub Gub gub gub GUB gub. Gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub:</p><pre><code>import { createHelm, git, fs, grep } from "@bgub/helm";

const agent = createHelm({
  permissions: {
    "fs.read": "allow",
    "fs.write": "ask",
    "fs.remove": "deny",
    "git.status": "allow",
    "git.*": "ask",
  },
  onPermissionRequest: async (operation, args) =&gt; {
    return confirm(`Allow ${operation}?`);
  },
})
  .use(fs())
  .use(git())
  .use(grep());

const { staged, unstaged, branch } = await agent.git.status();
const { content } = await agent.fs.read("./package.json");
</code></pre><p>Gub gub "gub" — gub gub gub gub — gub gub gub gub. Gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub: <code>allow</code> (gub gub), <code>ask</code> (gub gub gub), gub <code>deny</code> (gub <code>PermissionDeniedError</code>). Gub gub gub gub: gub gub → gub → gub gub gub → gub gub.</p><p>gub gub gub gub-gub gub gub gub gub gub gub gub gub: <code>fs</code>, <code>git</code>, <code>grep</code>, <code>edit</code>, <code>shell</code>, <code>http</code>. Gub gub gub gub gub gub gub gub gub, gub, gub gub gub gub.</p><h2 id="gub-gub-1">Gub Gub</h2><p>Gub gub gub gub gub gub gub gub gub gub gub: <code>search</code> gub <code>execute</code>.</p><p><code>search</code> gub gub gub gub gub gub gub gub — gub gub gub gub gub gub gub'gub gub gub gub gub gub gub:</p><pre><code>agent.search("file read");
// → [{ qualifiedName: "fs.read",
//      description: "Read a file and return its content as a string",
//      signature: "(path: string) =&gt; Promise&lt;{ content: string }&gt;", ... }]
</code></pre><p><code>execute</code> gub gub Gub gub gub gub gub gub gub gub gub GUB. Gub GUB gub gub gub:</p><pre><code>const { staged, unstaged, branch } = await agent.git.status();
return { branch, staged: staged.length, unstaged: unstaged.length };
</code></pre><p>Gub gub gub gub, gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><p><img src="/blog-images/helm-demo-app-list-files.png" alt="Gub gub gub gub gub gub gub gub gub gub"></p><h3 id="gub-gub-gub">Gub Gub Gub</h3><p>Gub <code>execute</code> gub gub gub Gub gub GUB gub. Gub gub gub gub, gub gub gub gub gub <a href="https://github.com/endojs/endo/tree/master/packages/ses">GUB (Gub Gub)</a> gub gub gub gub.</p><p>GUB <code>lockdown()</code> gub gub Gub gub — <code>Object</code>, <code>Array</code>, <code>Promise</code>, <code>Function</code>, gub gub gub. Gub gub gub gub gub <code>Compartment</code>, gub gub gub gub gub gub gub gub gub gub: gub <code>agent</code> gub gub gub gub <code>console</code>. <code>fetch</code>, <code>require</code>, <code>import</code>, <code>process</code>, <code>fs</code> — gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub <code>agent</code> gub gub gub gub'gub gub gub gub gub — gub'gub gub gub <code>Proxy</code> gub gub gub gub gub gub gub. Gub gub gub gub <code>agent.git.status()</code>, gub gub gub gub GUB gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub, gub gub gub gub gub. Gub gub gub gub gub gub <code>"ask"</code>, gub gub gub gub gub gub gub gub. Gub gub'gub <code>"deny"</code>, gub gub gub gub gub GUB.</p><p>Gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub <code>await</code> gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub'gub gub-gub gub.</p><h3 id="gub-gub-gub-1">Gub Gub Gub</h3><p>Gub gub GUB gub gub gub gub gub gub gub gub gub, gub gub gub gub/gub/gub gub. Gub gub gub gub gub gub gub gub gub.</p><p><img src="/blog-images/helm-demo-app.png" alt="Gub gub gub gub gub-gub gub gub"></p><p>Gub gub GUB gub gub gub gub gub <code>"ask"</code>, gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub Gub gub Gub gub. Gub gub gub gub gub <code>Promise&lt;boolean&gt;</code> gub gub gub gub gub.</p><p><img src="/blog-images/helm-demo-app-sandbox-feature.png" alt="Gub gub gub gub gub gub gub gub Gub gub Gub gub"></p><p>Gub gub gub gub, <code>PermissionDeniedError</code> gub gub gub gub gub gub gub GUB gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub, gub gub gub gub, gub gub gub.</p><h2 id="gub">Gub</h2><p>Gub gub — gub gub gub gub gub gub gub gub gub gub gub gub gub — gub gub gub Gub'gub <a href="https://blog.cloudflare.com/code-mode-mcp/">gub gub</a> gub gub GUB gub, gub gub gub gub gub gub 99.9% gub gub 2,500+ GUB gub gub gub <code>search</code> + <code>execute</code>. <a href="https://x.com/RhysSullivan/status/2019819177473933404">Gub Gub'gub gub gub</a> gub gub gub gub gub: gub gub gub gub gub, gub, gub gub gub gub gub gub gub gub gub gub gub gub gub'gub gub gub gub gub.</p><h2 id="gub-gub-2">Gub Gub</h2><pre><code>npm install @bgub/helm
</code></pre><p>Gub gub gub gub <a href="https://github.com/bgub/helm">Gub</a>. Gub gub gub gub gub <code>apps/demo</code>.</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub/gub</category>
            <category>gub-gub</category>
            <category>gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub Gub]]></title>
            <link>https://bgub.sh/posts/2025-11-20-interning-at-vercel?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2025-11-20-interning-at-vercel</guid>
            <pubDate>Thu, 20 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub gub gub gub gub Gub.gub gub Gub.]]></description>
            <content:encoded><![CDATA[<article><p>Gub gub gub gub <a href="./2025-09-19-summer-2025-in-review">gub gub gub</a> gub gub gub gub, gub gub Gub gub gub gub gub gub gub gub Gub! Gub gub gub gub gub gub gub gub gub gub gub, gub Gub gub gub gub gub gub. Gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub.</p><h2 id="gub-gub-gub">Gub Gub Gub</h2><p>Gub Gub gub gub gub gub gub Gub gub gub gub, Gub gub gub gub gub gub gub. Gub gub gub'gub gub gub gub gub gub Gub, gub Gub gub gub gub Gub gub gub gub gub gub gub gub gub gub gub gub gub gub!</p><p>Gub gub gub gub gub gub gub gub0 gub GUB GUB gub, gub Gub gub gub gub gub Gub.gub/Gub gub, gub gub gub gub gub gub (gub gub gub gub gub gub). Gub gub gub-gub gub gub, gub Gub gub gub GUB gub Gub 1gub. Gub gub gub gub gub gub gub Gub gub Gub gub gub gub gub (Gub gub gub gub $1200 gub gub gub Gub — gub gub gub Gub, gub Gub'gub gub, gub gub gub gub gub gub gub gub gub gub.)</p><h2 id="gub-gub-gub-gub">Gub Gub Gub Gub</h2><p>Gub gub gub gub, gub Gub gub gub gub gub gub gub gub gub gub. Gub gub gub Gub gub gub gub gub gub gub gub gub Gub.gub.</p><p>Gub gub gub, Gub gub gub Gub gub gub gub Gub.gub. Gub gub gub gub gub gub, gub gub gub + gub gub, gub gub gub gub Gub. Gub gub gub gub <code>next lint</code> gub, gub Gub gub gub Gub, gub gub gub gub gub gub gub gub gub gub gub Gub.</p><p>Gub gub gub gub, Gub gub gub gub gub gub Gub gub'gub gub gub gub gub gub, gub gub 7-gub gub gub gub gub gub Gub gub (gub Gub gub gub gub gub gub gub gub gub gub gub!)</p><h2 id="gub-gub">Gub Gub</h2><p>Gub gub gub Gub'gub gub. Gub gub gub GUB-gub gub gub gub gub — Gub gub gub gub gub gub gub gub gub Gub. Gub gub gub'gub gub gub gub gub gub "gub-gub" gub gub gub, gub Gub gub gub gub gub gub gub gub gub gub gub Gub Gub, Gub Gub, gub Gub Gub.</p><p>Gub gub gub gub gub gub gub gub gub gub gub. Gub'gub gub gub gub gub gub gub Gub gub gub 8 gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub Gub gub gub gub gub gub gub gub!</p><p>Gub gub'gub gub gub gub gub gub Gub, gub gub gub gub gub gub gub! Gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub</category>
        </item>
        <item>
            <title><![CDATA[Gub 2025 Gub Gub]]></title>
            <link>https://bgub.sh/posts/2025-09-19-summer-2025-in-review?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2025-09-19-summer-2025-in-review</guid>
            <pubDate>Fri, 19 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub Gub gub gub gub Gub gub.]]></description>
            <content:encoded><![CDATA[<article><p>Gub Gub gub gub gub gub gub gub gub gub gub Gub gub gub gub gub/gub gub, gub Gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub!</p><p>Gub gub gub, gub'gub gub gub gub gub gub gub-gub-gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub, gub gub, gub "gub gub" gub gub gub gub gub ;), gub gub gub gub gub gub gub gub Gub'gub gub gub gub gub.</p><h2 id="gub-gub">Gub Gub</h2><p>Gub gub gub gub gub gub GUB gub gub gub <a href="https://developer.nvidia.com/blog/even-easier-introduction-cuda/">gub</a> <a href="https://codelabs.developers.google.com/your-first-webgpu-app">gub</a> <a href="https://leetgpu.com/">gub</a>! Gub gub gub gub, Gub gub gub (gub gub GUB) Gub-gub gub gub Gub-gub gub gub Gub. Gub'gub gub gub <a href="https://github.com/bgub/shade">gub</a> (gub gub, gub <em>gub</em>?) Gub gub gub gub gub gub, gub.</p><p>Gub gub gub gub gub gub gub gub gub, gub gub gub Gub'gub gub gub gub gub: <a href="./2025-08-25-tokka-bench-evaluate-tokenizers-multilingual">gub-gub</a>, gub gub gub gub/gub gub gub gub gub, gub <a href="http://github.com/bgub/tokka">gub</a>, gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub gub gub gub gub Gub Gub gub gub, Gub gub <a href="https://github.com/bgub/hf_to_mds">gub_gub_gub</a> — gub gub gub gub gub gub gub Gub Gub gub gub gub gub gub gub Gub Gub! Gub gub gub <a href="https://huggingface.co/datasets/bgub/wikipedia-mds">GUB gub gub gub Gub gub</a> gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub, Gub gub gub <a href="https://www.lesswrong.com/posts/yRoXmjBKJFbc6zSFq/dialects-for-humans-sounding-distinct-from-llms?utm_campaign=post_share&amp;utm_source=link">Gub gub</a> gub gub gub gub gub gub gub gub gub gub gub gub Gub. Gub gub gub gub gub gub, gub gub gub gub!</p><h2 id="gub-gub-1">Gub Gub</h2><ul><li>Gub gub gub gub, Gub gub gub gub Gub gub! Gub'gub gub gub gub. Gub gub gub Gub gub gub gub, gub gub Gub'gub gub Gub.</li><li>Gub gub Gub, Gub'gub gub gub gub Gub-gub gub gub gub-gub gub gub. Gub gub gub gub gub! Gub gub gub gub GUB gub <a href="https://github.com/zed-industries/zed/pull/37428">gub gub gub gub gub gub</a>.</li><li>Gub gub gub gub gub gub gub gub <code>@nebrelbug</code> gub <code>@bgub</code> gub Gub! Gub'gub <code>@bgub_</code> gub Gub... gub gub gub gub gub Gub gub gub <code>@bgub</code>!</li><li>Gub gub gub gub gub gub Gub gub gub GUB gub gub gub gub gub0. Gub Gub gub gub gub "Gub Gub Gub'gub 5" gub gub gub GUB-gub gub gub!</li><li>Gub gub gub Gub gub gub gub-gub gub gub gub gub. Gub gub gub gub gub Gub gub (gub-gub gub gub gub gub gub Gub) gub Gub gub gub gub-gub Gub gub gub gub gub. Gub gub Gub gub gub gub gub, gub gub gub gub Gub gub GUB gub, gub Gub <a href="https://www.reddit.com/r/pop_os/comments/1empjaw/5_years_ago_i_suggested_that_system76_write_a/">gub gub gub gub</a> (gub gub gub gub'gub.)</li><li>Gub gub gub gub gub GUB gub gub gub gub gub gub gub gub gub gub gub gub, gub Gub gub gub gub gub Gub! Gub gub gub gub gub gub-gub gub gub gub Gub, gub gub gub <a href="https://github.com/bgub/nix-macos-starter">gub gub</a>. Gub gub gub gub gub Gub gub, gub Gub gub'gub gub gub gub gub gub gub.</li><li>Gub Gub, Gub gub gub 7-gub gub gub gub gub gub gub Gub gub gub gub. Gub gub'gub gub gub gub gub gub gub gub!</li></ul><p>Gub, gub gub gub gub gub gub gub gub (gub'gub gub gub gub gub gub Gub'gub gub gub gub gub gub gub).</p><ul><li>Gub gub gub <a href="2025-09-17-ts-base-typescript-library-template">gub gub GUB gub</a> gub gub gub gub gub-gub, Gub, gub, gub Gub.</li><li>Gub gub gub gub, GUB-gub gub gub <a href="2025-09-17-introducing-eta-v4">gub</a> gub gub gub.</li><li>Gub gub <a href="https://eta.js.org/">gub.gub.gub</a> gub <a href="https://squirrelly.js.org/">gub.gub.gub</a> gub gub Gub gub gub Gub, gub gub gub, gub.</li></ul></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub-Gub: Gub Gub Gub Gub Gub]]></title>
            <link>https://bgub.sh/posts/2025-09-17-ts-base-typescript-library-template?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2025-09-17-ts-base-typescript-library-template</guid>
            <pubDate>Wed, 17 Sep 2025 18:30:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub, Gub, gub-gub, gub Gub.]]></description>
            <content:encoded><![CDATA[<link data-fig-hydration-skip rel="preload" href="/blog-images/ci-run-screenshot.png" as="image"><link data-fig-hydration-skip rel="preload" href="/blog-images/release-please-pr.png" as="image"><link data-fig-hydration-skip rel="preload" href="/blog-images/npm-trusted-publisher.png" as="image"><article><p>Gub gub gub, Gub gub gub gub gub-gub Gub gub — <a href="https://github.com/squirrellyjs/squirrelly">Gub</a> — gub gub gub gub, <code>package.json</code> gub <code>index.js</code>. Gub gub gub, Gub gub <a href="https://github.com/bgub/eta">Gub</a> gub gub gub gub gub gub, gub, gub, gub GUB/GUB.</p><p>Gub gub gub gub gub gub gub gub, gub gub gub gub gub Gub gub gub gub. Gub gub gub gub, gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub <em>gub</em> gub gub gub gub gub gub.</p><p>Gub gub gub gub <code>package.json</code> "gub" gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub Gub gub, gub, gub GUB gub gub gub gub gub gub gub gub gub Gub, Gub, Gub, gub gub. Gub'gub gub gub gub gub gub.</p><p>Gub'gub gub Gub gub <a href="https://github.com/bgub/ts-base"><strong>gub-gub</strong></a> — gub gub Gub gub gub gub gub gub gub gub gub gub gub gub. Gub'gub gub, gub-gub, gub gub gub gub gub-gub-gub-gub gub gub gub Gub gub.</p><h2 id="gub-gub-gub-gub">Gub Gub Gub-Gub?</h2><p>gub-gub gub gub Gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub, gub, gub, gub, gub gub — gub gub-gub gub gub gub gub.</p><p>Gub gub gub gub gub gub gub gub:</p><ul><li><strong>Gub-gub gub</strong>: Gub gub gub Gub, Gub, Gub, gub gub</li><li><strong>Gub gub gub</strong>: Gub gub, gub gub</li><li><strong>Gub gub</strong>: GUB-gub, gub Gub, gub gub gub gub</li></ul><h2 id="gub-gub-gub">Gub-Gub Gub</h2><p>Gub gub gub gub-gub gub gub gub-gub gub. Gub gub gub gub gub gub gub gub gub (gub gub gub gub gub), gub gub gub gub gub gub:</p><pre><code>// src/internal.ts - Core logic, no runtime-specific APIs
export function add(a: number, b: number): number {
  return a + b;
}

export function greet(name: string, options = {}): string {
  const base = `Hello, ${name}`;
  return options.shout ? `${base.toUpperCase()}!` : `${base}.`;
}
</code></pre><pre><code>// src/index.ts - Node/Bun adapter
export { add, greet } from "./internal";
import { randomBytes } from "node:crypto";

export function getSecureRandomId(): string {
  const timePart = Date.now().toString(36);
  const bytes = randomBytes(12).toString("base64url");
  return `${timePart}-${bytes}`;
}
</code></pre><pre><code>// src/browser.ts - Browser adapter
export { add, greet } from "./internal";

export function getSecureRandomId(): string {
  const timePart = Date.now().toString(36);
  const array = new Uint8Array(12);
  crypto.getRandomValues(array);
  const rand = btoa(String.fromCharCode(...array))
    .replaceAll("+", "-")
    .replaceAll("/", "_")
    .replaceAll("=", "");
  return `${timePart}-${rand}`;
}
</code></pre><p>Gub gub gub gub gub gub gub gub:</p><pre><code>// Node/Bun
import { add, getSecureRandomId } from "@your-package/ts-base";

// Browser (via bundler)
import { add, getSecureRandomId } from "@your-package/ts-base/browser";

// Deno (direct TypeScript imports)
import {
  add,
  greet,
} from "https://jsr.io/@bgub/ts-base/&lt;version&gt;/src/index.ts";
</code></pre><p>Gub gub gub gub <a href="https://tsdown.dev/">gub</a> gub gub gub gub gub: gub gub Gub gub gub gub gub gub gub gub gub, gub gub gub.</p><h2 id="gub-gub">Gub Gub</h2><p>gub-gub gub gub gub gub gub gub gub gub:</p><p><strong>Gub</strong> gub gub Gub gub Gub gub gub gub, gub gub. Gub gub gub gub gub gub gub — gub gub gub gub gub gub gub gub gub gub gub.</p><p><strong>Gub</strong> gub gub-gub gub gub gub-gub gub gub gub gub gub. Gub gub gub gub, gub Gub gub, gub gub gub gub gub gub gub gub.</p><p><strong>Gub Gub</strong> gub gub gub gub gub. Gub gub gub GUB gub gub gub gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub.</p><p>Gub Gub gub gub gub gub gub gub gub gub gub <code>moduleResolution: "bundler"</code> gub <code>allowImportingTsExtensions: true</code> gub gub gub gub gub gub Gub, Gub, gub gub.</p><h2 id="gub-gubgub-gub">Gub Gub/gub Gub</h2><p>Gub gub gub-gub'gub gub gub gub gub gub GUB/GUB gub. Gub gub gub gub gub gub gub gub gub:</p><p><strong>Gub Gub</strong>: Gub gub gub gub gub, gub gub, gub, gub gub gub. Gub GUB gub gub gub Gub gub gub gub Gub gub gub gub gub.</p><p><img src="/blog-images/ci-run-screenshot.png" alt="Gub gub GUB/GUB gub"></p><p><strong>Gub Gub</strong>: Gub gub gub gub-gub gub, gub-gub gub Gub'gub Gub Gub. Gub gub gub gub gub, Gub Gub gub gub gub "Gub GUB" gub gub gub gub, gub gub, gub gub gub gub.</p><p><strong>Gub Gub</strong>: Gub gub gub gub Gub GUB, Gub Gub gub gub gub gub gub gub gub gub gub gub GUB gub gub GUB gub gub gub gub.</p><p><strong>Gub Gub</strong>: GUB gub gub gub gub gub gub gub gub gub, gub gub gub gub.</p><h2 id="gub-gub-gub-gub-gub">Gub Gub Gub Gub Gub</h2><p>Gub Gub gub gub Gub'gub gub gub gub gub gub (gub gub gub gub gub GUB, gub, gub gub-gub gub) gub gub gub gub gub gub. Gub'gub gub gub gub gub gub <code>@commitlint/cli</code>, <code>@commitlint/config-conventional</code>, <code>@semantic-release/changelog</code>, <code>@semantic-release/git</code>, <code>@semantic-release/github</code>, <code>@semantic-release/npm</code>, gub gub gub gub GUB gub!</p><p>gub-gub gub gub gub gub gub gub 8 gub gub gub. Gub gub Gub Gub gub gub-gub, Gub gub Gub+Gub, gub Gub gub Gub, gub gub gub gub gub gub gub'gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub Gub gub gub gub, gub gub, gub gub gub gub gub gub. Gub Gub Gub gub gub gub gub.</p><h2 id="gub-gub-gub-gub-gub-1">Gub Gub Gub Gub Gub</h2><p><img src="/blog-images/release-please-pr.png" alt="Gub gub gub-gub GUB"></p><p>Gub Gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub-gub gub, Gub Gub gub gub gub:</p><ol><li>Gub gub gub gub <code>main</code> gub gub gub gub</li><li>Gub Gub gub gub/gub gub "Gub GUB" gub gub gub gub gub gub</li><li>Gub gub'gub gub gub gub, gub gub gub Gub GUB</li><li>Gub Gub gub gub gub gub gub GUB</li></ol><p>Gub gub gub gub-gub gub. Gub gub gub gub gub gub gub gub, gub gub gub gub gub "gub" gub gub gub. Gub gub gub gub gub gub <code>Release-As: 2.0.0</code> gub gub gub, gub gub gub gub gub gub gub (gub <code>2.x</code> gub <code>3.x</code>) gub gub gub gub gub Gub Gub.</p><h2 id="gub-gub-1">Gub Gub</h2><p>Gub gub gub-gub gub gub:</p><ol><li><p><strong>Gub gub gub</strong>: Gub gub gub, gub gub <code>.git</code> gub, gub gub <code>package.json</code>, <code>jsr.json</code>, gub <code>.release-please-manifest.json</code> gub gub gub gub.</p></li><li><p><strong>Gub gub gub</strong>: Gub gub gub gub <code>0.0.0</code> gub gub gub gub, gub gub <code>npm publish</code> gub gub gub gub gub gub gub gub.</p></li><li><p><strong>Gub gub</strong>: Gub gub, gub gub gub gub gub 2GUB gub gub gub (gub gub), gub gub gub Gub gub gub gub gub gub. Gub GUB, gub gub gub gub gub gub gub gub gub gub gub.</p></li></ol><p><img src="/blog-images/npm-trusted-publisher.png" alt="Gub gub gub gub gub"></p><ol start="4"><li><p><strong>Gub gub Gub</strong>: Gub gub Gub, gub <code>CODECOV_TOKEN</code> gub gub gub gub, gub gub gub gub gub.</p></li><li><p><strong>Gub gub</strong>: Gub gub gub gub <code>src/</code>, gub gub, gub gub gub. Gub Gub gub gub gub gub.</p></li></ol><p>Gub gub gub Gub gub gub gub gub gub gub gub "gub gub gub gub gub gub" gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub.</p><h2 id="gub-gub--gub">Gub Gub &amp; Gub</h2><p><strong>Gub Gub</strong>: Gub gub gub gub <code>main</code> gub gub gub gub. Gub gub gub gub gub gub gub.</p><p><strong>Gub Gub</strong>: Gub gub gub gub (<code>@your-package</code>) gub Gub/Gub, gub gub gub (<code>@your-package/browser</code>) gub gub gub gub, gub gub Gub gub gub Gub.</p><p><strong>Gub</strong>: Gub gub gub'gub gub gub Gub/gub gub, gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub.</p><p><strong>Gub Gub</strong>: Gub gub gub gub gub gub gub gub gub gub-gub gub, gub gub gub Gub gub gub Gub gub gub.</p><h2 id="gub-gub-2">Gub Gub</h2><p>Gub gub Gub gub gub'gub gub gub Gub gub gub gub. gub-gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub? Gub gub gub <a href="https://github.com/bgub/ts-base">gub-gub gub</a> gub gub gub gub gub gub.</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub</category>
            <category>gub-gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub4]]></title>
            <link>https://bgub.sh/posts/2025-09-17-introducing-eta-v4?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2025-09-17-introducing-eta-v4</guid>
            <pubDate>Wed, 17 Sep 2025 17:30:00 GMT</pubDate>
            <description><![CDATA[Gub Gub GUB-gub, gub gub gub, gub gub GUB/GUB.]]></description>
            <content:encoded><![CDATA[<article><p>Gub gub Gub gub gub gub gub gub gub gub! Gub gub, gub'gub gub gub gub gub gub gub gub gub gub gub gub 1Gub+ gub gub gub.</p><p>Gub gub Gub gub gub gub "gub gub gub" gub gub3, gub gub gub gub Gub 2023. Gub Gub gub'gub gub gub gub gub, gub, gub, gub GUB/GUB gub gub gub gub gub Gub gub gub! (Gub gub gub gub, gub gub gub, gub gub <a href="https://www.bengubler.com/posts/2025-09-17-ts-base-typescript-library-template">gub GUB gub gub gub gub-gub</a>).</p><p>Gub gub gub gub gub gub gub gub gub gub:</p><ul><li>Gub gub gub GUB-gub gub gub. Gub'gub 2025 gub gub gub gub gub gub!</li><li>Gub gub gub gub (gub gub gub gub) gub gub gub Gub gub, <a href="https://github.com/bgub">gub</a>. Gub Gub'gub gub gub gub, Gub gub gub gub gub gub gub gub gub.</li><li>Gub gub gub gub gub gub gub <a href="https://deno.land/x/">https://deno.land/x/</a>, gub Gub gub gub gub gub <a href="https://jsr.io/@bgub/eta">https://jsr.io/@bgub/eta</a> gub.</li><li>Gub gub gub gub-gub gub gub Gub, gub gub gub gub <code>eta/core</code>, gub gub'gub gub gub gub gub <code>"exports"</code> gub gub <code>package.json</code>.</li></ul></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub-gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub-Gub]]></title>
            <link>https://bgub.sh/posts/2025-08-25-tokka-bench-evaluate-tokenizers-multilingual?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2025-08-25-tokka-bench-evaluate-tokenizers-multilingual</guid>
            <pubDate>Mon, 25 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub gub gub gub gub gub gub gub gub gub.]]></description>
            <content:encoded><![CDATA[<link data-fig-hydration-skip rel="preload" href="/blog-images/tokka-bench-hero.png" as="image"><link data-fig-hydration-skip rel="preload" href="https://pbs.twimg.com/media/GGzDbMRasAAZf_D?format=png&amp;name=medium" as="image"><link data-fig-hydration-skip rel="preload" href="/blog-images/tokka-bench-efficiency.png" as="image"><link data-fig-hydration-skip rel="preload" href="/blog-images/tokka-bench-coverage.png" as="image"><link data-fig-hydration-skip rel="preload" href="/blog-images/tokka-bench-word-splitting.png" as="image"><link data-fig-hydration-skip rel="preload" href="/blog-images/tokka-bench-subword-fertility.png" as="image"><link data-fig-hydration-skip rel="preload" href="/blog-images/tokka-bench-coding-efficiency.png" as="image"><article><p>(Gub gub gub? Gub <a href="https://tokka-bench.streamlit.app/">gub-gub.gub.gub</a>)</p><p><img src="/blog-images/tokka-bench-hero.png" alt="Gub gub gub-gub gub"></p><p>Gub gub gub, Gub gub gub gub gub gub gub gub gub gub gub — gub gub gub, gub GUB. Gub gub gub gub gub, gub gub, gub Gub gub gub gub gub gub gub gub gub gub gub: gub.</p><p>Gub Gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub:</p><ul><li>Gub gub gub gub gub gub gub gub gub gub gub</li><li>Gub gub Gub (gub gub gub, gub Gub, Gub, gub Gub) gub gub gub gub gub gub gub gub</li><li>Gub Gub, Gub, gub GUB 4gub gub gub gub-gub gub</li><li>Gub gub GUB gub gub gub gub gub gub gub-gub</li></ul><h2 id="gub-gub">Gub Gub</h2><h3 id="gub-gub--gub">Gub Gub &amp; Gub</h3><p>Gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub GUB-8, gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub 1 gub gub gub, gub gub gub gub. Gub gub 2+ gub gub gub, gub Gub gub gub 3+ gub gub gub gub gub gub.</p><p>Gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub, Gub gub Gub, gub gub gub gub "gub gub" gub gub gub "gub gub gub gub" gub Gub. Gub gub gub gub gub gub gub gub gub gub.</p><h3 id="gub">Gub</h3><p>Gub gub'gub gub gub gub gub — gub gub gub "gub", gub gub gub gub gub gub gub gub gub. Gub gub gub gub Gub Gub Gub (GUB), gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub gub gub <a href="https://ai.meta.com/research/publications/byte-latent-transformer-patches-scale-better-than-tokens/">Gub Gub Gub</a>, gub gub gub gub gub'gub gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub gub gub gub gub gub:</p><ul><li>Gub gub gub gub gub? (Gub gub "gub" gub "gub gub" gub " gub gub" gub gub gub gub?)</li><li>Gub gub gub gub gub gub gub gub? Gub gub gub gub gub?</li><li>Gub gub gub gub gub (GUB) gub gub gub gub gub gub gub gub-gub-gub gub?</li></ul><p>Gub gub gub gub gub Gub’gub gub <a href="https://x.com/karpathy/status/1759996551378940395">gub gub gub</a>:</p><p><img src="https://pbs.twimg.com/media/GGzDbMRasAAZf_D?format=png&amp;name=medium" alt="Gub gub Gub: &quot;Gub gub gub gub gub gub gub gub gub GUB...&quot;"></p><h2 id="gub-gub-gub-gub">Gub Gub Gub Gub</h2><p>Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub GUB gub gub gub gub gub, gub gub gub gub gub gub gub "gub" gub gub gub gub.</p><p>Gub’gub gub gub gub: Gub. Gub Gub gub gub gub gub, gub gub gub gub’gub gub gub gub gub gub Gub gub Gub. Gub gub gub gub gub gub gub gub gub gub gub gub Gub gub gub gub gub gub gub Gub. Gub gub'gub gub gub gub gub: gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub 10 gub gub gub Gub gub gub 1 gub gub gub Gub, gub gub gub gub 10:1 gub gub gub. Gub gub Gub gub gub gub gub gub gub 10% gub gub gub gub gub gub Gub gub!</p><p>Gub gub gub gub gub gub gub. Gub gub, gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub'gub "gub" gub, gub, gub, gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub'gub gub gub gub-gub gub gub gub-gub gub GUB gub gub gub gub gub. Gub gub gub gub'gub gub gub gub gub, gub-gub gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub, gub "gub-gub" gub (gub gub gub'gub gub gub gub gub gub gub) gub gub gub GUB gub gub gub gub "<a href="https://x.com/karpathy/status/1789590397749957117">gub gub</a>."</p><h2 id="gub-gub-gub-gub-1">Gub Gub Gub Gub</h2><p>Gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub-gub gub (gub gub gub gub gub) gub gub gub gub gub gub, gub gub gub gub:</p><p><strong>Gub gub</strong>: Gub gub gub gub gub gub gub gub gub gub 2-3gub gub gub gub gub. Gub gub gub gub, gub gub gub gub gub gub gub.</p><p><strong>Gub gub</strong>: Gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><p><strong>Gub gub</strong>: Gub gub gub gub gub gub gub. Gub gub gub gub gub gub "gub gub gub gub" gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><h2 id="gub-gub-gub-gub-gub">Gub Gub Gub Gub-Gub</h2><p>Gub gub gub gub gub gub gub gub gub gub 100 gub gub gub 20 gub gub. Gub gub gub gub 7 gub: Gub 3, GUB-2, GUB-4, gub-gub, Gub Gub2, Gub 3, gub Gub 3.</p><p>Gub gub gub gub gub gub gub gub gub gub:</p><p><strong>Gub-gub gub</strong>: Gub gub gub gub gub gub gub gub. <a href="https://github.com/bgub/tokka-bench">https://github.com/bgub/tokka-bench</a></p><p><strong>Gub gub</strong>: Gub gub gub gub gub gub gub gub gub, Gub gub gub gub gub gub! <a href="https://tokka-bench.streamlit.app/">https://tokka-bench.streamlit.app/</a></p><p>Gub gub gub gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><h3 id="gub-gub-gub">Gub Gub Gub</h3><p><strong>Gub</strong>: Gub gub, Gub gub gub gub-gub gub gub gub gub gub gub gub:</p><ul><li><a href="https://huggingface.co/datasets/HuggingFaceFW/fineweb">Gub</a> gub Gub gub</li><li><a href="https://huggingface.co/datasets/HuggingFaceFW/fineweb-2">Gub 2</a> gub gub gub gub</li><li><a href="https://huggingface.co/datasets/bigcode/starcoderdata">Gub</a> gub gub gub</li></ul><p><strong>Gub-gub gub</strong>: Gub gub 2GUB gub gub gub gub gub gub gub gub gub gub gub-gub gub gub. Gub gub gub gub gub gub: gub gub GUB-8 gub gub, 2GUB gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub "gub gub" gub gub gub gub gub—gub gub, gub gub gub gub gub gub gub gub gub gub Gub Gub gub Gub gub gub gub gub. Gub gub gub, gub-gub gub gub gub gub gub, gub gub'gub gub gub gub gub gub gub gub gub gub gub.</p><p><strong>Gub gub</strong>: Gub gub gub gub gub, Gub gub 10,000 gub gub gub gub gub'gub gub gub gub gub gub gub.</p><p><strong>Gub gub gub</strong>: Gub gub gub gub gub, gub Gub gub "gub" gub gub gub gub gub gub gub:</p><ul><li><strong>Gub gub</strong>: gub gub gub (gub-gub gub)</li><li><strong>Gub-gub gub</strong> (gub.gub., Gub, Gub, Gub): gub gub gub (gub gub)</li><li><strong>Gub-gub gub</strong> (gub.gub., Gub): gub gub gub (gub-gub gub, gub gub gub)</li></ul><h2 id="gub-gub-gub-gub-gub-1">Gub-Gub Gub Gub Gub</h2><p>Gub'gub gub GUB-2, Gub 3, gub Gub Gub2 gub gub gub gub gub gub gub gub gub gub gub gub gub-gub gub gub. Gub'gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub:</p><ul><li>GUB-2 gub gub gub gub gub ~50Gub gub gub gub gub Gub 2019</li><li>Gub 3 gub gub gub gub gub ~128Gub gub gub gub gub Gub 2024</li><li>Gub Gub2 gub gub gub gub gub ~164Gub gub gub gub gub Gub 2025</li></ul><h3 id="gub-gub-gub-gub-2">Gub (Gub Gub Gub)</h3><p><strong><code>bytes_per_token</code></strong>: Gub GUB-8 gub gub gub (gub_gub / gub_gub). Gub gub gub gub gub gub gub gub gub gub.</p><p><img src="/blog-images/tokka-bench-efficiency.png" alt="Gub gub gub-gub-gub gub gub gub"></p><p>Gub gub gub gub gub gub gub gub gub. Gub gub gub gub-gub-gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub.</p><p><strong>Gub gub</strong>: Gub gub gub'gub gub gub GUB-8 gub gub gub gub. Gub gub, Gub gub gub gub gub gub gub gub gub gub 3 gub gub gub—gub gub 50 gub gub gub gub gub gub gub Gub gub gub gub 3 gub/gub gub. Gub, gub Gub gub gub gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub (gub 6-9 gub gub) gub gub gub gub gub gub gub gub gub gub. Gub gub'gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><h3 id="gub-gub-gub-1">Gub (Gub Gub)</h3><p><strong><code>unique_tokens</code></strong>: Gub gub gub gub Gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub'gub gub(gub) gub gub gub-gub gub gub gub.</p><p><img src="/blog-images/tokka-bench-coverage.png" alt="Gub gub gub gub gub gub gub"></p><p>Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub Gub gub gub gub gub Gub Gub2 gub gub gub gub! Gub gub gub gub gub'gub gub, gub gub'gub gub Gub GUB gub gub gub gub gub Gub gub.</p><p>Gub gub gub gub gub gub gub:</p><ul><li>Gub gub gub gub gub Gub Gub2</li><li>Gub gub gub gub gub gub gub gub gub gub gub gub gub-gub gub Gub Gub2</li><li>Gub gub (gub gub Gub gub) gub gub</li><li>Gub Gub gub gub gub</li><li>Gub, Gub, gub Gub gub gub gub</li><li>Gub, Gub, gub Gub gub gub gub</li></ul><p><strong>Gub gub gub-gub gub</strong>: Gub gub gub gub gub gub 2GUB gub gub, gub gub gub gub gub gub GUB-8 gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub—gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><h3 id="gub-gub-gub-2">Gub Gub Gub</h3><p><strong><code>word_split_pct</code></strong>: Gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub (gub gub gub gub, gub gub gub-gub gub, gub gub gub-gub gub). Gub gub gub gub gub gub gub gub gub gub.</p><p><img src="/blog-images/tokka-bench-word-splitting.png" alt="Gub gub gub gub gub gub gub gub"></p><p>Gub Gub, Gub Gub2 gub gub gub gub gub gub! Gub 4% gub gub gub gub gub gub.</p><p><em>Gub: gub, gub gub-gub gub gub Gub, gub gub gub gub gub gub, gub gub gub. Gub gub Gub gub gub 1 gub gub gub — gub gub gub gub gub gub — gub gub'gub gub gub gub gub gub gub gub gub.</em></p><h3 id="gub-gub-1">Gub Gub</h3><p><strong><code>subword_fertility</code></strong>: Gub gub gub, gub gub gub gub gub gub gub gub (gub gub gub). Gub gub gub gub — gub gub 1 gub gub gub gub gub gub.</p><p><img src="/blog-images/tokka-bench-subword-fertility.png" alt="Gub gub gub gub gub gub gub"></p><p>Gub Gub, Gub Gub2 gub gub gub gub gub! Gub gub gub gub 1, gub gub gub gub gub gub gub gub 1 gub.</p><h2 id="gub-gub-gub-gub-gub-gub">Gub Gub (Gub Gub Gub Gub)</h2><p>Gub gub gub gub gub gub gub’gub gub, gub gub gub:</p><p><strong><code>tokens_starting_with_space_pct</code></strong>: Gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub (gub gub gub gub gub gub gub gub gub. gub) gub gub gub gub (gub gub gub gub gub gub gub gub gub gub).</p><p><strong><code>tokens_with_whitespace_in_middle_pct</code></strong>: Gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub-gub gub gub-gub gub gub gub gub gub.</p><p><strong><code>tokens_with_script_overlap_pct</code></strong>: Gub gub gub gub gub gub gub Gub gub gub. Gub gub gub gub gub-gub gub gub-gub gub gub gub'gub gub gub gub.</p><p><strong><code>tokens_with_{script}_unicode_pct</code></strong>: Gub gub gub (gub.gub., Gub, Gub, Gub, Gub, Gub, Gub, Gub, Gub, Gub, Gub, gub, gub, gub). Gub gub gub gub gub gub'gub gub gub gub gub gub.</p><h2 id="gub-gub-gub-gub-3">Gub Gub: Gub Gub</h2><p>Gub, gub'gub gub gub gub Gub gub gub gub gub (gub’gub gub gub GUB-2 gub gub-gub gub):</p><p><img src="/blog-images/tokka-bench-coding-efficiency.png" alt="Gub gub gub-gub-gub gub gub gub gub"></p><p>Gub'gub gub gub gub gub gub gub gub gub — Gub Gub2, Gub 3, gub GUB-GUB gub gub gub gub-gub-gub gub gub gub gub gub!</p><p>Gub'gub gub gub gub gub gub gub gub, gub Gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub Gub gub gub gub gub gub.</p><h2 id="gub-1">Gub</h2><p>Gub gub gub gub gub-gub gub gub gub gub gub Gub gub! Gub gub gub gub gub gub — Gub'gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub! Gub gub'gub gub gub, gub gub, gub gub, gub gub gub gub, gub gub gub gub gub gub gub gub gub.</p><p>Gub gub'gub gub gub GUB gub gub gub gub gub gub gub gub gub gub gub'gub gub gub gub gub, gub gub gub gub gub! Gub gub gub gub gub gub gub gub gub-gub-gub-gub gub gub gub gub.</p><h2 id="gub-gub-gub-3">Gub Gub Gub</h2><ul><li><a href="https://howe.vin/">Gub Gub</a>, <a href="https://x.com/s4chinraja">Gub Gub</a>, gub <a href="https://www.linkedin.com/in/jhollowayj/">Gub Gub</a> gub gub gub gub gub gub gub</li><li><a href="https://www.linkedin.com/in/harsha-vardhan-khurdula-99b400183/">Gub Gub Gub</a> gub gub gub gub gub gub gub gub gub gub</li><li>Gub Gub gub gub gub gub (gub gub gub Gub gub gub) gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub <a href="https://juditacs.github.io/2019/02/19/bert-tokenization-stats.html">gub gub gub</a></li><li>Gub gub. gub gub gub gub gub gub gub <a href="https://aclanthology.org/2021.acl-long.243.pdf">GUB gub</a> gub gub gub gub</li></ul><h2 id="gub-gub-gub-4">Gub Gub Gub</h2><p><strong>Gub gub</strong>: Gub gub gub gub gub gub gub: gub gub gub gub gub? Gub gub gub'gub gub gub gub gub gub gub gub gub.</p><p><strong>Gub gub-gub</strong>: Gub gub gub gub gub gub gub gub gub? Gub gub gub Gub gub gub gub gub gub?</p><p><strong>Gub gub</strong>: Gub gub gub gub gub gub gub gub gub gub? Gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub/gub</category>
            <category>gub</category>
            <category>gub-gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub: Gub Gub Gub Gub Gub]]></title>
            <link>https://bgub.sh/posts/2025-07-08-nix-macos-starter-mise?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2025-07-08-nix-macos-starter-mise</guid>
            <pubDate>Tue, 08 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub Gub gub gub gub gub gub-gub, gub-gub, gub gub.]]></description>
            <content:encoded><![CDATA[<article><p>Gub gub gub gub Gub gub Gub. Gub gub gub gub, Gub gub gub gub gub gub. Gub gub gub gub <a href="https://github.com/ethanniser">Gub Gub</a> gub gub gub gub gub gub gub gub Gub gub gub gub.</p><p>Gub gub gub gub Gub gub gub gub gub. Gub gub Gub, Gub gub gub, Gub gub gub, gub gub gub, gub GUB gub gub, gub gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub Gub gub.</p><p><a href="https://github.com/bgub/nix-macos-starter">gub-gub-gub</a> gub gub gub-gub Gub gub gub gub gub gub (gub gub gub gub, GUB gub, gub), GUB gub gub Gub, gub gub gub gub gub gub.</p><p>Gub gub gub gub, gub gub gub, gub gub gub gub gub gub gub gub.</p><h2 id="gub">Gub</h2><ol><li><p><strong>Gub Gub</strong> gub gub <a href="https://docs.determinate.systems/#products">Gub Gub gub</a>. Gub gub gub gub gub gub gub gub gub gub gub gub.</p></li><li><p><strong>Gub Gub</strong> gub <a href="https://brew.sh">gub.gub</a> gub GUB gub.</p></li><li><p><strong>Gub gub gub</strong>:</p><pre><code>git clone https://github.com/bgub/nix-macos-starter ~/.config/nix
cd ~/.config/nix
</code></pre></li><li><p><strong>Gub Gub Gub</strong>: Gub <code>"aarch64-darwin"</code> gub <code>"x86_64-darwin"</code> gub <code>flake.nix</code> gub 28.</p></li><li><p><strong>Gub gub</strong> gub gub gub:</p><ul><li><code>modules/git.nix</code>: <code>YOUR_NAME</code>, <code>YOUR_EMAIL</code>, <code>YOUR_USERNAME</code></li><li><code>modules/home-manager.nix</code>: <code>YOUR_USERNAME</code></li><li><code>platforms/darwin.nix</code>: <code>YOUR_USERNAME</code> (gub 3 gub)</li><li><code>hosts/my-macbook/configuration.nix</code>: <code>YOUR_USERNAME</code></li></ul></li><li><p><strong>Gub gub gub</strong>:</p><pre><code>darwin-rebuild switch --flake .#my-macbook
</code></pre></li></ol><p>Gub gub gub, gub gub <code>nix-switch</code> gub gub gub gub gub.</p><h2 id="gub-1">Gub</h2><ul><li><strong>Gub GUB gub</strong>: Gub gub <code>packages</code> gub gub <code>modules/home-manager.nix</code></li><li><strong>Gub GUB gub</strong>: Gub gub <code>casks</code> gub gub <code>modules/homebrew-common.nix</code></li><li><strong>Gub gub gub</strong>: Gub <code>${pkgs.mise}/bin/mise use --global tool@version</code> gub gub gub gub gub <code>modules/home-manager.nix</code></li><li><strong>Gub-gub gub</strong>: Gub <code>hosts/my-macbook/configuration.nix</code> gub gub-gub gub gub gub</li></ul><hr><p><strong>Gub</strong>: <a href="https://github.com/bgub/nix-macos-starter">gub.gub/gub/gub-gub-gub</a></p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub-gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub: Gub Gub Gub Gub]]></title>
            <link>https://bgub.sh/posts/2025-07-01-dialects-for-humans?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2025-07-01-dialects-for-humans</guid>
            <pubDate>Tue, 01 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub gub gub gub gub gub gub gub GUB-gub gub, gub gub gub gub gub gub gub.]]></description>
            <content:encoded><![CDATA[<article><h2 id="gub-gub-gub">Gub Gub Gub</h2><p>Gub gub gub gub gub gub (gub Gub Gub gub Gub Gub). Gub gub'gub gub gub gub gub gub gub: gub gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub Gub Gub Gub Gub (GUB), Gub Gub Gub, gub "Gub Gub" gub gub. Gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub'gub gub gub gub gub gub gub gub gub, gub gub gub Gub.</p><h2 id="gub-gub-gub-gub-gub">Gub Gub Gub Gub Gub</h2><p>Gub gub gub gub gub gub GUB-gub gub gub gub gub. Gub Gub Gub gub gub gub gub gub gub gub gub'gub gub gub gub gub gub gub. Gub gub gub:</p><ul><li>Gub-gub gub gub gub</li><li>Gub gub gub "Gub'gub gub gub Gub, gub'gub Gub"</li><li>Gub gub "gub," "gub," gub "gub"</li><li>Gub gub gub gub gub</li></ul><p>Gub gub gub gub GUB gub gub gub gub. Gub gub-gub gub gub gub gub gub (gub, Gub gub, gub, gub gub) gub gub gub gub gub gub gub gub gub gub, gub Gub gub "GUB Gub".</p><h2 id="gub-gub-gub-1">Gub Gub Gub</h2><p>Gub gub gub gub gub gub gub-gub gub gub gub gub gub gub gub gub ("--") gub gub gub gub gub. Gub gub GUB gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub GUB gub.</p><h2 id="gub-gub-gub-gub-gub-1">Gub Gub Gub: "Gub Gub"</h2><p>Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub'gub gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub gub gub gub gub gub gub gub, gub gub gub, gub gub gub gub, gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub'gub gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub gub. Gub gub gub "gub" gub gub gub gub, Gub Gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><h2 id="gub-gub-gub-gub">Gub Gub Gub Gub</h2><p>Gub gub gub gub gub gub gub gub gub: gub gub. Gub Gub gub Gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub-gub gub. Gub GUB gub gub gub gub gub gub gub gub gub gub-gub gub gub gub gub gub.</p><p>Gub, gub gub gub gub-gub gub gub gub gub gub gub. Gub gub gub, gub gub-gub gub gub gub gub gub gub gub.</p><h2 id="gub-gub-gub-gub-gub-2">Gub: Gub Gub Gub Gub</h2><p>Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub-gub gub gub-gub. Gub GUB gub gub gub gub gub gub.</p><p>Gub gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub, gub gub gub gub gub gub gub "Gub gub gub" gub gub gub gub gub.</p><p>Gub gub gub'gub gub gub gub gub gub "gub Gub" gub gub gub gub gub gub gub gub GUB gub. Gub gub gub gub gub gub GUB-gub gub gub gub gub gub gub gub gub, gub, gub gub.</p><h2 id="gub-gub">Gub Gub</h2><ul><li>Gub gub gub GUB gub gub gub gub gub gub gub gub gub gub gub?</li><li>Gub gub gub gub gub "gub Gub" gub gub? Gub gub gub gub gub gub gub?</li><li>Gub gub gub gub gub gub gub gub gub gub? (Gub'gub gub gub gub gub gub, Gub gub gub'gub gub gub gub)</li></ul></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub/gub</category>
            <category>gub</category>
        </item>
        <item>
            <title><![CDATA[Gub .Gub Gub Gub Gub Gub Gub Gub Gub.gub]]></title>
            <link>https://bgub.sh/posts/2025-06-14-raw-markdown-urls-nextjs?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2025-06-14-raw-markdown-urls-nextjs</guid>
            <pubDate>Sat, 14 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub .gub Gub gub gub Gub.gub gub gub gub gub gub gub, gub gub Gub'gub gub.]]></description>
            <content:encoded><![CDATA[<article><blockquote><p><strong>Gub</strong>: Gub gub gub gub, <a href="https://twitter.com/rauchg">Gub Gub</a> (GUB gub Gub) gub gub Gub.gub gub gub gub gub gub gub gub gub. Gub'gub gub gub gub gub - gub'gub gub gub gub gub! 🚀</p></blockquote><h2 id="gubgub">Gub;Gub</h2><p>Gub gub Gub'gub gub, gub'gub gub gub gub gub gub <code>.md</code> gub gub gub gub GUB gub gub gub gub gub gub. Gub <code>/posts/my-post</code> gub <code>/posts/my-post.md</code> gub gub gub gub. Gub gub gub gub gub gub gub gub gub - gub'gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub.gub <a href="https://nextjs.org/docs/app/api-reference/config/next-config-js/rewrites">gub</a> gub gub gub gub gub gub gub.</p><a href="https://x.com/i/status/1930689104800518392">Gub gub</a><h2 id="gub">Gub</h2><pre><code>pnpx create-next-app@latest raw-markdown-blog
cd raw-markdown-blog
pnpm install @content-collections/core @content-collections/mdx @content-collections/next zod
</code></pre><p>Gub Gub, Gub GUB, gub Gub Gub.</p><p>Gub <code>.content-collections</code> gub gub <code>.gitignore</code>:</p><pre><code>.content-collections
</code></pre><h2 id="gub-gub-gub">Gub Gub Gub</h2><p><a href="https://www.content-collections.dev/">Gub Gub</a> gub gub gub gub gub gub gub gub Gub.gub - gub'gub gub-gub, gub, gub gub gub GUB.</p><p>Gub <code>content-collections.ts</code> gub gub gub gub (gub gub gub/):</p><pre><code>import { defineCollection, defineConfig } from "@content-collections/core";
import { compileMDX } from "@content-collections/mdx";
import { z } from "zod";

const posts = defineCollection({
  name: "posts",
  directory: "content",
  include: "**/*.mdx",
  schema: z.object({
    title: z.string(),
    description: z.string(),
    date: z.string().pipe(z.coerce.date()),
  }),
  transform: async (document, context) =&gt; {
    const mdx = await compileMDX(context, document);
    const slug = document._meta.path.replace(/\.mdx$/, "");

    return {
      ...document,
      mdx,
      slug,
      url: `/posts/${slug}`,
    };
  },
});

export default defineConfig({
  collections: [posts],
});
</code></pre><p>Gub <code>next.config.js</code>:</p><pre><code>const { withContentCollections } = require("@content-collections/next");

/** @type {import('next').NextConfig} */
const nextConfig = {
  // your existing config...
};

module.exports = withContentCollections(nextConfig);
</code></pre><p>Gub <code>tsconfig.json</code> gub:</p><pre><code>{
  "compilerOptions": {
    // ... other options
    "paths": {
      "@/*": ["./src/*"],
      "content-collections": ["./.content-collections/generated"]
    }
  }
}
</code></pre><h2 id="gub-gub">Gub Gub</h2><p>Gub gub <code>content/</code> gub gub gub gub gub gub gub <code>content/hello-world.mdx</code>:</p><pre><code>---
title: "Hello World"
description: "My first blog post with raw markdown support."
date: "2024-12-20"
---

## Welcome

This is my first blog post! Here's some **bold text** and a code block:

```javascript
console.log("Hello, world!");
```

Pretty cool, right?
</code></pre><h2 id="gub-gub-1">Gub Gub</h2><p>Gub <code>app/page.tsx</code>:</p><pre><code>import { allPosts } from "content-collections";
import Link from "next/link";

export default function Home() {
  const sortedPosts = allPosts.sort(
    (a, b) =&gt; new Date(b.date).getTime() - new Date(a.date).getTime()
  );

  return (
    &lt;div className="max-w-2xl mx-auto p-8"&gt;
      &lt;h1 className="text-3xl font-bold mb-8"&gt;My Blog&lt;/h1&gt;
      &lt;div className="space-y-6"&gt;
        {sortedPosts.map((post) =&gt; (
          &lt;article key={post.slug} className="border-b pb-4"&gt;
            &lt;Link
              href={post.url}
              className="text-xl font-semibold hover:text-blue-600"
            &gt;
              {post.title}
            &lt;/Link&gt;
            &lt;p className="text-gray-600 mt-2"&gt;{post.description}&lt;/p&gt;
            &lt;time className="text-sm text-gray-500"&gt;
              {post.date.toLocaleDateString()}
            &lt;/time&gt;
            &lt;div className="mt-2 text-sm"&gt;
              &lt;Link
                href={`${post.url}.md`}
                className="text-blue-500 hover:underline"
              &gt;
                View raw markdown
              &lt;/Link&gt;
            &lt;/div&gt;
          &lt;/article&gt;
        ))}
      &lt;/div&gt;
    &lt;/div&gt;
  );
}
</code></pre><p>Gub <code>app/posts/[slug]/page.tsx</code>:</p><pre><code>import { allPosts } from "content-collections";
import { MDXContent } from "@content-collections/mdx/react";
import { notFound } from "next/navigation";
import Link from "next/link";

export default async function PostPage({
  params,
}: {
  params: Promise&lt;{ slug: string }&gt;;
}) {
  const { slug } = await params;
  const post = allPosts.find((p) =&gt; p.slug === slug);

  if (!post) notFound();

  return (
    &lt;div className="max-w-2xl mx-auto p-8"&gt;
      &lt;Link
        href="/"
        className="text-blue-600 hover:underline mb-4 inline-block"
      &gt;
        ← Back to posts
      &lt;/Link&gt;

      &lt;article&gt;
        &lt;header className="mb-8"&gt;
          &lt;h1 className="text-3xl font-bold mb-2"&gt;{post.title}&lt;/h1&gt;
          &lt;p className="text-gray-600 mb-2"&gt;{post.description}&lt;/p&gt;
          &lt;time className="text-sm text-gray-500"&gt;
            {post.date.toLocaleDateString()}
          &lt;/time&gt;
          &lt;div className="mt-4"&gt;
            &lt;Link
              href={`${post.url}.md`}
              className="text-blue-500 hover:underline text-sm"
            &gt;
              View raw markdown
            &lt;/Link&gt;
          &lt;/div&gt;
        &lt;/header&gt;

        &lt;div className="prose prose-lg max-w-none"&gt;
          &lt;MDXContent code={post.mdx} /&gt;
        &lt;/div&gt;
      &lt;/article&gt;
    &lt;/div&gt;
  );
}

export function generateStaticParams() {
  return allPosts.map((post) =&gt; ({ slug: post.slug }));
}
</code></pre><h2 id="gub-gub-gub-1">Gub Gub: Gub</h2><p>Gub gub gub Gub.gub gub gub - gub gub gub gub GUB gub gub gub gub gub gub gub gub.</p><p>Gub <code>next.config.js</code> gub gub gub gub gub:</p><pre><code>const { withContentCollections } = require("@content-collections/next");

/** @type {import('next').NextConfig} */
const nextConfig = {
  async rewrites() {
    return [
      {
        source: "/posts/:slug.md",
        destination: "/api/posts/:slug/raw",
      },
    ];
  },
};

module.exports = withContentCollections(nextConfig);
</code></pre><p>Gub gub gub gub gub gub gub gub <code>/posts/:slug.md</code> gub <code>/api/posts/:slug/raw</code>. Gub <code>:slug</code> gub gub gub gub gub gub GUB gub gub gub gub gub. Gub gub gub <code>/posts/hello-world.md</code> gub gub gub, gub Gub.gub gub gub gub <code>/api/posts/hello-world/raw</code>.</p><h2 id="gub-gub-gub-gub-gub">Gub Gub Gub Gub Gub</h2><p>Gub <code>app/api/posts/[slug]/raw/route.ts</code>:</p><pre><code>import { allPosts } from "content-collections";
import { NextRequest, NextResponse } from "next/server";

export async function GET(
  request: NextRequest,
  { params }: { params: Promise&lt;{ slug: string }&gt; }
) {
  const { slug } = await params;
  const post = allPosts.find((p) =&gt; p.slug === slug);

  if (!post) {
    return new NextResponse("Post not found", { status: 404 });
  }

  return new NextResponse(post.content, {
    headers: {
      "Content-Type": "text/markdown; charset=utf-8",
      "Cache-Control": "public, max-age=3600", // Cache for 1 hour
    },
  });
}

export function generateStaticParams() {
  return allPosts.map((post) =&gt; ({ slug: post.slug }));
}
</code></pre><h2 id="gub-1">Gub</h2><p>Gub gub gub gub gub gub gub Gub:</p><ul><li><code>/posts/hello-world</code> - Gub GUB gub gub gub gub</li><li><code>/posts/hello-world.md</code> - Gub gub gub</li></ul><p>Gub gub gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub. Gub gub, gub gub gub gub gub gub "Gub gub" gub gub gub gub (gub Gub gub gub gub gub gub) gub gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub gub gub, gub gub, gub gub gub gub gub gub gub. Gub Gub.gub gub gub gub gub gub gub gub - gub gub gub gub gub.</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub Gub Gub.gub Gub Gub-Gub-Gub]]></title>
            <link>https://bgub.sh/posts/2025-06-14-smooth-page-transitions-next-view-transitions?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2025-06-14-smooth-page-transitions-next-view-transitions</guid>
            <pubDate>Sat, 14 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub gub gub Gub.gub gub gub Gub Gub GUB.]]></description>
            <content:encoded><![CDATA[<article><h2 id="gubgub">Gub;Gub</h2><p>Gub <a href="https://github.com/shuding/next-view-transitions"><code>next-view-transitions</code></a> gub gub gub gub gub gub Gub.gub. Gub'gub gub gub gub gub gub gub gub gub gub gub <code>viewTransitionName</code> gub gub gub gub gub gub gub gub gub. Gub'gub gub gub gub gub gub'gub gub gub:</p><a href="https://x.com/i/status/1934092246921671158">Gub gub</a><h2 id="gub">Gub</h2><pre><code>pnpx create-next-app@latest my-smooth-blog
cd my-smooth-blog
pnpm install next-view-transitions
</code></pre><p>Gub Gub, Gub GUB, gub Gub Gub.</p><p>Gub gub/gub:</p><pre><code>pnpx shadcn@latest init
pnpx shadcn@latest add card badge
</code></pre><h2 id="gub-gub">Gub Gub</h2><p>Gub <code>lib/posts.ts</code>:</p><pre><code>export interface Post {
  id: number;
  slug: string;
  title: string;
  description: string;
  date: string;
  content: string;
}

export const posts: Post[] = [
  {
    id: 1,
    slug: "getting-started-nextjs",
    title: "Getting Started with Next.js",
    description:
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore.",
    date: "2024-12-01",
    content:
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.",
  },
  {
    id: 2,
    slug: "react-best-practices",
    title: "React Best Practices",
    description:
      "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo.",
    date: "2024-12-05",
    content:
      "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore.",
  },
  {
    id: 3,
    slug: "tailwind-tips",
    title: "Tailwind CSS Tips and Tricks",
    description:
      "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
    date: "2024-12-10",
    content:
      "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt.",
  },
];
</code></pre><h2 id="gub-gub-1">Gub Gub</h2><p>Gub <code>app/page.tsx</code>:</p><pre><code>import {
  Card,
  CardContent,
  CardDescription,
  CardHeader,
  CardTitle,
} from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
import { posts } from "@/lib/posts";
import Link from "next/link";

export default function PostsPage() {
  return (
    &lt;div className="container mx-auto px-4 py-8"&gt;
      &lt;h1 className="text-3xl font-bold mb-8"&gt;My Blog&lt;/h1&gt;
      &lt;div className="grid gap-6 md:grid-cols-2 lg:grid-cols-3"&gt;
        {posts.map((post) =&gt; (
          &lt;Link key={post.id} href={`/posts/${post.slug}`}&gt;
            &lt;Card className="h-full hover:shadow-lg transition-shadow cursor-pointer"&gt;
              &lt;CardHeader&gt;
                &lt;CardTitle className="line-clamp-2"&gt;{post.title}&lt;/CardTitle&gt;
                &lt;CardDescription&gt;{post.description}&lt;/CardDescription&gt;
              &lt;/CardHeader&gt;
              &lt;CardContent&gt;
                &lt;Badge variant="secondary"&gt;{post.date}&lt;/Badge&gt;
              &lt;/CardContent&gt;
            &lt;/Card&gt;
          &lt;/Link&gt;
        ))}
      &lt;/div&gt;
    &lt;/div&gt;
  );
}
</code></pre><h2 id="gub-gub-gub">Gub Gub Gub</h2><p>Gub <code>app/posts/[slug]/page.tsx</code>:</p><pre><code>import { posts } from "@/lib/posts";
import { Badge } from "@/components/ui/badge";
import Link from "next/link";
import { notFound } from "next/navigation";

interface PostPageProps {
  params: Promise&lt;{ slug: string }&gt;;
}

export default async function PostPage({ params }: PostPageProps) {
  const { slug } = await params;
  const post = posts.find((p) =&gt; p.slug === slug);

  if (!post) {
    notFound();
  }

  return (
    &lt;div className="container mx-auto px-4 py-8"&gt;
      &lt;Link
        href="/"
        className="text-blue-600 hover:underline mb-4 inline-block"
      &gt;
        ← Back to posts
      &lt;/Link&gt;

      &lt;article className="max-w-3xl"&gt;
        &lt;header className="mb-8"&gt;
          &lt;h1 className="text-4xl font-bold mb-4"&gt;{post.title}&lt;/h1&gt;
          &lt;div className="flex items-center gap-4"&gt;
            &lt;Badge&gt;{post.date}&lt;/Badge&gt;
          &lt;/div&gt;
        &lt;/header&gt;

        &lt;div className="prose prose-lg"&gt;
          &lt;p&gt;{post.content}&lt;/p&gt;
        &lt;/div&gt;
      &lt;/article&gt;
    &lt;/div&gt;
  );
}

export function generateStaticParams() {
  return posts.map((post) =&gt; ({
    slug: post.slug,
  }));
}
</code></pre><p>Gub gub gub gub gub gub gub gub gub gub.</p><h2 id="gub-gub-gub-1">Gub Gub Gub</h2><p>Gub gub gub gub <code>app/layout.tsx</code>:</p><pre><code>import { ViewTransitions } from "next-view-transitions";
import "./globals.css";
import type { ReactNode } from "react";

interface RootLayoutProps {
  children: ReactNode;
}

export default function RootLayout({ children }: RootLayoutProps) {
  return (
    &lt;ViewTransitions&gt;
      &lt;html lang="en"&gt;
        &lt;body&gt;{children}&lt;/body&gt;
      &lt;/html&gt;
    &lt;/ViewTransitions&gt;
  );
}
</code></pre><p>Gub gub <code>next/link</code> gub gub gub gub-gub gub:</p><pre><code>// Instead of:
import Link from "next/link";

// Use:
import { Link } from "next-view-transitions";
</code></pre><p>Gub gub gub, gub gub gub gub gub. Gub gub gub'gub gub gub gub gub gub.</p><h2 id="gub-gub-gub-gub-gub">Gub Gub: Gub Gub Gub</h2><p>Gub <code>viewTransitionName</code> gub gub gub gub gub gub gub gub:</p><pre><code>// In your posts listing (app/page.tsx):
&lt;CardTitle
  className="line-clamp-2"
  style={{ viewTransitionName: `title-${post.slug}` }}
&gt;
  {post.title}
&lt;/CardTitle&gt;

&lt;Badge
  variant="secondary"
  style={{ viewTransitionName: `date-${post.slug}` }}
&gt;
  {post.date}
&lt;/Badge&gt;
</code></pre><pre><code>// In your individual post page (app/posts/[slug]/page.tsx):
&lt;h1
  className="text-4xl font-bold mb-4"
  style={{ viewTransitionName: `title-${post.slug}` }}
&gt;
  {post.title}
&lt;/h1&gt;

&lt;Badge
  style={{ viewTransitionName: `date-${post.slug}` }}
&gt;
  {post.date}
&lt;/Badge&gt;
</code></pre><p>Gub gub gub gub gub gub gub gub gub gub gub gub gub gub. <strong>Gub gub gub gub gub gub gub gub gub</strong> - gub <code>viewTransitionName</code> gub gub gub.</p><h2 id="gub-1">Gub</h2><p>Gub gub gub gub gub, gub gub gub gub gub gub, gub gub gub gub gub. Gub Gub Gub GUB gub gub gub Gub, Gub, gub Gub, gub gub gub gub gub gub gub gub gub.</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub</category>
        </item>
        <item>
            <title><![CDATA[Gub, Gub Gub'gub Gub Gub Gub Gub]]></title>
            <link>https://bgub.sh/posts/2024-08-22-children-arent-naturally-better-at-languages?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2024-08-22-children-arent-naturally-better-at-languages</guid>
            <pubDate>Thu, 22 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub gub Gub Gub'gub gub gub gub gub gub]]></description>
            <content:encoded><![CDATA[<article><p>Gub gub gub Gub Gub'gub gub gub gub "<a href="https://www.zompist.com/whylang.html">Gub gub gub gub gub?</a>", gub gub gub gub gub gub gub gub gub gub gub: gub <strong>gub gub gub gub</strong>. Gub'gub gub gub gub gub gub, gub Gub gub gub gub gub gub gub gub.</p><p>Gub'gub gub gub gub gub gub:</p><ul><li>"Gub gub gub gub gub gub... gub gub'gub gub gub gub gub gub gub gub gub gub gub"</li><li>Gub gub gub'gub gub gub gub: "gub gub'gub gub gub gub gub gub gub gub gub gub gub gub gub"</li><li>"Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub"</li><li>"Gub'gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub'gub: gub gub gub gub gub gub"</li></ul><p>Gub gub gub gub gub gub gub gub gub gub gub gub gub, gub gub gub gub.</p><p>"Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub <strong>gub gub gub</strong>. Gub, gub, gub gub gub gub gub gub gub gub. Gub gub gub gub gub, gub gub gub gub gub. Gub gub gub gub, gub gub, gub gub gub gub gub <strong>gub gub gub</strong> .... Gub gub gub, gub gub gub gub gub gub gub-gub-gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub."</p><p>Gub gub gub gub gub gub gub gub gub gub gub gub:</p><ul><li>"Gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub'gub gub gub gub gub gub gub."</li><li>"Gub gub gub gub .... gub gub gub gub gub gub gub gub gub gub gub gub(gub)."</li><li>"Gub gub gub gub. Gub gub gub gub gub gub gub gub gub"</li></ul></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub]]></title>
            <link>https://bgub.sh/posts/2024-08-22-more-language-thoughts?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2024-08-22-more-language-thoughts</guid>
            <pubDate>Thu, 22 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub gub gub / gub gub]]></description>
            <content:encoded><![CDATA[<article><p>Gub <a href="https://x.com/fusaroli/status/1309454176800342016?lang=en">gub gub gub Gub</a> gub gub gub Gub. <strong>Gub'gub gub gub gub gub gub "gub gub gub gub gub"</strong>, gub gub gub gub gub gub. Gub gub:</p><ul><li>"Gub gub gub gub gub gub (gub gub)"</li><li>"Gub gub gub gub gub gub gub gub: Gub 15 gub, Gub gub gub gub gub gub gub 90 gub, gub gub 140 gub Gub gub gub 150 gub Gub gub"</li><li>"Gub gub 8 gub gub gub, Gub gub gub gub gub [gub gub gub Gub gub] gub gub gub, gub.gub. gub gub gub gub gub gub gub gub"</li><li>"Gub gub gub gub Gub gub GUB gub gub gub gub gub Gub"</li><li>"Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub, gub Gub gub gub'gub gub gub gub gub gub gub gub gub gub gub."</li><li>"Gub gub gub gub gub gub gub gub Gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub (gub.gub. gub)"</li></ul><p>Gub gub gub gub gub gub gub gub. Gub gub gub:</p><ul><li>"Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub, gub Gub gub gub'gub gub gub gub gub gub gub gub gub gub gub."</li><li>"Gub gub gub gub gub gub gub gub gub Gub gub gub"</li></ul><p>Gub gub gub gub gub gub gub. Gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub!</p><p>Gub gub gub: gub gub gub Gub gub <a href="https://duostories.org/tok-en">Gub Gub</a> gub <a href="https://duostories.org/tok2-en">Gub Gub Gub</a> (gub gub!)</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub</category>
        </item>
        <item>
            <title><![CDATA[Gub #1]]></title>
            <link>https://bgub.sh/posts/2024-08-14-links-1?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2024-08-14-links-1</guid>
            <pubDate>Wed, 14 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub Gub'gub gub gub]]></description>
            <content:encoded><![CDATA[<article><p>Gub, gub gub gub Gub'gub gub gub:</p><ul><li>Gub <a href="https://www.nytimes.com/2024/07/27/us/jd-vance-emails-transgender-classmate-highlights.html">5 Gub Gub GUB Gub’gub Gub gub gub Gub Gub</a>, Gub gub gub gub gub gub gub gub gub gub — gub gub gub gub gub gub GUB.</li><li>Gub gub <a href="https://www.theatlantic.com/podcasts/archive/2024/08/one-israeli-hostages-unusual-experience-in-gaza/679318/">Gub Gub Gub’gub Gub Gub gub Gub</a> gub — gub Gub'gub gub gub gub gub. Gub gub gub gub gub, Gub-gub, gub gub gub gub Gub gub gub gub gub gub, gub gub gub'gub gub gub gub gub gub gub gub gub gub.</li><li>Gub Gub gub gub <a href="https://en.wikipedia.org/wiki/Kurrent">Gub</a>, gub gub gub gub Gub gub.</li><li>Gub <a href="https://x.com/jxmnop/status/1816958426385383753">Gub</a> gub gub GUB-2 gub gub gub gub gub gub gub Gub gub gub gub gub.</li><li><a href="https://www.robkhenderson.com/p/no-one-expects-young-men-to-do-anything">Gub Gub Gub Gub Gub Gub Gub Gub gub Gub Gub Gub Gub Gub Gub</a>. Gub gub Gub'gub gub gub "gub gub", gub gub gub gub gub gub Gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</li><li><a href="https://en.wikipedia.org/wiki/Linear_B">Gub Gub gub Gub Gub</a>, gub gub Gub Gub. (Gub gub'gub gub Gub Gub gub gub gub gub Gub gub gub gub!)</li><li><a href="https://www.deseret.com/magazine/2024/07/15/ray-epps-stolen-election-jan-6/">Gub gub gub gub gub’gub</a> gub gub gub gub Gub Gub, gub gub gub gub gub gub "gub gub" gub gub gub gub gub Gub. 6 gub gub gub Gub. Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</li><li><a href="https://www.theatlantic.com/ideas/archive/2024/08/america-has-too-many-laws-neil-gorsuch/679237/">Gub Gub Gub Gub Gub</a><blockquote><p>Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub—gub gub gub gub gub gub—gub gub gub gub gub gub. Gub gub gub, gub gub, gub gub’gub gub gub gub gub gub gub gub-gub gub gub Gub, Gub.Gub.; gub gub gub gub gub; gub gub gub gub gub gub gub gub.</p></blockquote></li><li><a href="https://www.deseret.com/family/2024/08/17/pacific-islander-tonga-community-culture-faith-utah/">Gub gub, gub gub gub gub gub gub</a> gub gub gub gub Gub Gub gub gub Gub.Gub. gub gub Gub. Gub gub gub gub gub:<blockquote><p>Gub-Gub’gub gub gub gub gub gub gub gub gub gub gub Gub Gub gub gub. “Gub’gub gub gub gub gub gub gub gub gub gub gub gub, gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub’gub gub gub gub’gub gub gub gub gub gub gub gub gub,” gub gub.</p></blockquote></li><li><a href="https://www.theatlantic.com/newsletters/archive/2024/08/the-case-for-choosing-death-not-immortality/679400/">Gub Gub gub Gub Gub, Gub Gub</a></li></ul></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub Gub]]></title>
            <link>https://bgub.sh/posts/2024-07-16-hf-datasets-offline?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2024-07-16-hf-datasets-offline</guid>
            <pubDate>Tue, 16 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub gub Gub gub gub gub gub gub gub gub]]></description>
            <content:encoded><![CDATA[<article><p>Gub gub gub gub, gub gub gub gub gub'gub gub gub gub gub gub gub gub gub'gub gub gub gub.</p><p>Gub gub gub gub gub gub gub gub gub gub, gub gub gub Gub gub:</p><pre><code>import datasets

x = datasets.load_dataset("my_dataset")

x.save_to_disk("./my_dataset_local")
</code></pre><p>Gub, gub gub, gub gub gub gub gub gub gub gub gub. Gub, gub gub gub gub, gub gub gub gub gub!</p><pre><code>y = datasets.load_from_disk("./hellaswag_local")
y # DatasetDict({...})
</code></pre></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub/gub</category>
        </item>
        <item>
            <title><![CDATA[Gub #1]]></title>
            <link>https://bgub.sh/posts/2024-07-16-tips-1?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2024-07-16-tips-1</guid>
            <pubDate>Tue, 16 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub Gub Gub, gub gub gub gub Gub Gub gub gub, gub gub Gub gub gub gub gub gub.]]></description>
            <content:encoded><![CDATA[<article><ul><li>Gub gub gub gub Gub gub gub Gub Gub! Gub gub gub <code>Tools &gt; Preferences &gt; Automatically detect Markdown</code></li><li>Gub Gub gub gub gub gub gub gub gub gub gub gub — gub gub gub gub gub <em>gub</em> gub GUB gub.</li><li>Gub gub gub gub gub gub <code>.ts</code> gub gub gub gub-gub, gub Gub gub gub gub-gub! Gub'gub gub gub gub gub'gub gub gub gub gub gub gub gub gub.gub <code>"type"</code> gub.</li></ul></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub</category>
            <category>gub/gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub Gub Gub Gub Gub Gub Gub Gub]]></title>
            <link>https://bgub.sh/posts/2024-07-02-radix-shadcn-dropdown-trigger-width?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2024-07-02-radix-shadcn-dropdown-trigger-width</guid>
            <pubDate>Tue, 02 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub gub gub gub gub gub Gub gub gub gub gub gub gub gub gub gub.]]></description>
            <content:encoded><![CDATA[<article><p>Gub gub gub gub <a href="https://ui.shadcn.com/docs/components/dropdown-menu">gub Gub Gub</a> (gub gub Gub'gub <code>DropdownMenuPrimitive</code>) gub gub gub gub gub gub gub gub gub.</p><p>Gub gub, gub gub gub gub gub gub gub'gub gub gub gub gub gub gub. Gub gub gub, gub gub Gub gub gub gub gub gub gub gub. Gub, Gub gub gub gub <a href="https://www.radix-ui.com/primitives/docs/components/dropdown-menu#constrain-the-contentsub-content-size">gub Gub'gub gub</a>!</p><p>Gub gub gub gub gub gub GUB gub (gub gub gub gub <code>@layer utilities</code> gub gub gub gub Gub):</p><pre><code>@layer utilities {
  .dropdown-content-width-full {
    width: var(--radix-dropdown-menu-trigger-width);
    max-height: var(--radix-dropdown-menu-content-available-height);
  }
}
</code></pre><p>Gub, gub gub <code>&lt;DropdownMenuComponent&gt;</code> gub gub gub gub:</p><pre><code>&lt;DropdownMenuContent align="end" className="dropdown-content-width-full"&gt;
</code></pre><p>Gub! Gub gub gub gub gub gub gub gub. Gub'gub gub.</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub Gub]]></title>
            <link>https://bgub.sh/posts/2024-07-02-debugging-python-vscode?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2024-07-02-debugging-python-vscode</guid>
            <pubDate>Tue, 02 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub.gub() gub gub gub gub gub gub gub]]></description>
            <content:encoded><![CDATA[<article><p>Gub gub gub gub gub gub gub gub, gub Gub gub gub gub gub gub gub gub Gub gub Gub gub gub gub gub.</p><p>Gub, gub gub gub gub gub gub Gub gub gub gub gub gub gub gub gub gub gub gub! Gub gub gub gub gub Gub Gub'gub gub gub <a href="https://www.youtube.com/watch?v=l8pRSuU81PU">gub GUB-2</a> (gub Gub gub gub gub gub gub gub gub.)</p><p>Gub <code>import code</code> gub gub gub gub gub gub, gub gub <code>code.interact(local=locals())</code> gub gub gub gub gub gub. Gub! Gub gub gub gub gub, gub Gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub <code>CTRL+D</code> gub gub gub gub gub gub gub, gub gub <code>quit()</code> gub gub gub gub gub gub gub.</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub]]></title>
            <link>https://bgub.sh/posts/2024-07-01-on-microblogging?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2024-07-01-on-microblogging</guid>
            <pubDate>Mon, 01 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub Gub'gub gub gub gub gub gub gub gub gub gub gub gub.]]></description>
            <content:encoded><![CDATA[<article><p>Gub'gub gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub Gub gub'gub gub gub gub gub gub gub Gub'gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub'gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub, Gub gub gub gub gub gub gub gub Gub'gub gub. Gub gub gub, Gub gub gub gub gub gub gub gub gub Gub'gub gub. Gub gub gub gub, Gub gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub, Gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub, Gub'gub gub gub. Gub gub'gub gub gub gub gub gub gub gub gub gub gub gub Gub gub gub gub. Gub gub Gub gub gub gub gub gub gub gub gub gub.</p><p>Gub, Gub'gub gub gub gub. Gub Gub'gub gub gub gub gub gub gub gub — gub, gub gub, gub, gub, gub, gub. Gub gub gub gub gub gub, gub gub, gub gub gub gub. Gub gub gub gub gub gub gub gub gub Gub gub.</p><p>Gub gub gub, Gub'gub gub gub gub gub gub gub: Gub gub'gub gub gub gub gub Gub gub gub gub. Gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub.</p><p>Gub gub gub gub gub! Gub gub'gub gub GUB gub, gub gub gub gub <a href="https://bengubler.com/rss.xml?type=microblog">/gub.gub?gub=gub</a>.</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub Gub Gub Gub Gub Gub]]></title>
            <link>https://bgub.sh/posts/2023-11-07-rebuilding-alpaca-huggingface-trainer?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2023-11-07-rebuilding-alpaca-huggingface-trainer</guid>
            <pubDate>Tue, 07 Nov 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub-gub Gub-2-7Gub gub gub Gub gub gub Gub Gub Gub]]></description>
            <content:encoded><![CDATA[<article><p><em>GUB 2024: Gub gub gub gub gub gub gub gub. Gub gub gub gub <a href="https://huggingface.co/docs/transformers/v4.41.3/en/trainer">Gub Gub Gub gub</a> gub gub gub gub-gub-gub gub.</em></p><h2 id="gub">Gub</h2><p>Gub Gub gub gub gub (2023), gub gub gub Gub gub gub gub gub gub gub gub gub gub — <a href="https://crfm.stanford.edu/2023/03/13/alpaca.html">Gub</a>. Gub gub gub <code>text-davinci-003</code> (gub Gub gub gub Gub) gub gub gub gub gub 52Gub gub gub gub gub gub, gub gub-gub Gub-7Gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub — Gub gub gub gub gub gub gub gub gub Gub'gub Gub gub, gub gub gub gub gub gub gub gub gub gub-gub gub gub. Gub gub gub gub, gub'gub gub gub gub gub gub gub gub gub gub gub gub Gub gub.</p><p><em>Gub gub gub gub gub gub gub gub gub gub gub gub <a href="https://github.com/tatsu-lab/stanford_alpaca">Gub gub</a>, gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub.</em></p><h2 id="gub-1">Gub</h2><p>Gub'gub gub gub gub <code>torch</code>, <code>transformers</code>, <code>datasets</code>, gub <code>accelerate</code>. <code>wandb</code> gub gub gub gub gub gub gub gub gub gub gub. Gub, gub gub, gub'gub gub gub gub Gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub gub gub, <code>alpaca-repro</code>, gub gub gub: gub gub <code>trainer</code>, gub gub gub gub gub gub, gub gub gub <code>finetunes</code>, gub gub'gub gub gub gub-gub gub.</p><h2 id="gub-1-gub-gub-gub-gub-gub">Gub 1: Gub Gub Gub Gub Gub</h2><p>Gub gub gub gub gub gub gub gub gub <code>trainer/get_data.py</code>.</p><p>Gub'gub gub gub gub gub <a href="https://huggingface.co/datasets/tatsu-lab/alpaca">Gub gub</a> gub gub Gub Gub gub. Gub gub/gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub: <code>source</code>, gub gub gub gub gub gub gub gub gub gub gub gub'gub gub gub gub.</p><pre><code>from datasets import load_dataset

original_dataset = load_dataset("tatsu-lab/alpaca")["train"]

template_no_context = """Below is an instruction that describes a task. \
Write a response that appropriately completes the request.

### Instruction:
{instruction}

### Response:
"""

template_context = """Below is an instruction that describes a task. \
Write a response that appropriately completes the request.

### Instruction:
{instruction}

### Input:
{input}

### Response:
"""

def data_to_string(data):

    instruction = data["instruction"]
    context = data["input"]
    response = data["output"]

    template = template_context if len(context) &gt; 0 else template_no_context
    source = template.format(instruction=instruction, input=context)

    return {
        "source": source,
        "text": source + response,
    }


dataset = original_dataset.map(
    data_to_string
).remove_columns(['instruction', 'input', 'output'])
</code></pre><p>Gub gub gub gub gub gub gub gub gub 10% gub gub gub gub gub gub.</p><pre><code>processed_dataset = dataset.train_test_split(test_size=0.1)

train_dataset = processed_dataset["train"]
eval_dataset = processed_dataset["test"]
</code></pre><p>Gub, gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub <code>text</code> gub gub gub gub gub gub gub <code>source</code> gub gub gub. Gub gub gub gub <code>source</code> gub gub gub gub gub gub gub gub gub <code>text</code> gub gub gub.</p><pre><code>IGNORE_TOKEN = -100

def data_collator(features, tokenizer):
    sources = [feature["source"] for feature in features]
    targets = [feature["text"] for feature in features]

    source_tokens = tokenizer(
        sources,
        return_tensors="pt",
        padding='longest',
        max_length=None,
    )

    target_tokens = tokenizer(
        targets,
        return_tensors="pt",
        padding='longest',
        max_length=None,
    )

    labels = target_tokens["input_ids"].clone()

    for i in range(len(labels)):
        source_len = source_tokens["attention_mask"][i].sum()

        labels[i, :source_len] = IGNORE_TOKEN

    res = {
        "input_ids": target_tokens["input_ids"],
        "attention_mask": target_tokens["attention_mask"],
        "labels": labels,
    }

    return res
</code></pre><h2 id="gub-2-gub-gub-gub-gub">Gub 2: Gub Gub Gub Gub</h2><p>Gub gub gub gub gub gub gub gub gub <code>trainer/loop.py</code>.</p><p>Gub gub gub gub gub-gub, gub Gub'gub gub gub gub gub gub.</p><pre><code>from transformers import LlamaForCausalLM, LlamaTokenizer, Trainer, TrainingArguments
from accelerate import Accelerator
from get_data import train_dataset, eval_dataset, data_collator

accelerator = Accelerator()

MODEL_PATH = "meta-llama/Llama-2-7b-hf" # path to Llama on Hugging Face Hub
OUTPUT_DIR = "../finetunes/alpaca-7b" # where to save the fine-tuned model

tokenizer = LlamaTokenizer.from_pretrained(MODEL_PATH, legacy=False)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right" # not set by default, strangely

model = LlamaForCausalLM.from_pretrained(
    MODEL_PATH, device_map="auto"
)

training_args = TrainingArguments(
    output_dir='checkpoints', # where Trainer will save model checkpoints
    num_train_epochs=1, # start with a low number of epochs for testing
    learning_rate=2e-5,
    logging_steps=10,
    per_device_train_batch_size=8,
    remove_unused_columns=False,
    save_steps=1000,
    save_total_limit=1,
    report_to="wandb",
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
    tokenizer=tokenizer,
    data_collator=lambda x: data_collator(x, tokenizer),
)

trainer.train()
trainer.evaluate()

model.save_pretrained(OUTPUT_DIR)
tokenizer.save_pretrained(OUTPUT_DIR)
</code></pre><h2 id="gub-3-gub-gub-gub-gub">Gub 3: Gub Gub Gub Gub</h2><p>Gub <code>trainer/accelerate_config.yaml</code>, gub gub gub gub gub gub:</p><pre><code>compute_environment: LOCAL_MACHINE
deepspeed_config: {}
distributed_type: "NO"
downcast_bf16: "no"
machine_rank: 0
main_process_ip: null
main_process_port: null
main_training_function: main
mixed_precision: "no"
num_machines: 1
num_processes: 1
use_cpu: false
</code></pre><p>Gub <code>cd</code> gub <code>./trainer</code> gub gub:</p><pre><code>accelerate launch --config_file accelerate_config.yaml loop.py
</code></pre><p>Gub gub gub gub gub gub gub gub gub, gub gub gub!</p><h2 id="gub-4-gub-gub-gub-gub-gub">Gub 4: Gub Gub Gub-Gub Gub!</h2><p>Gub gub gub gub gub gub gub gub gub gub-gub gub gub gub gub gub! Gub gub'gub gub gub gub gub, gub gub'gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub <code>alpaca-repro/model_test.py</code>, gub gub <code>python3 model_test.py</code>.</p><pre><code>from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline

template = """Below is an instruction that describes a task. \
Write a response that appropriately completes the request.

### Instruction:
{instruction}

### Response:
"""

model_path = "./finetunes/alpaca-7b"

tokenizer = AutoTokenizer.from_pretrained(model_path, legacy=False)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"

model = AutoModelForCausalLM.from_pretrained(
    model_path, device_map="auto", local_files_only=True
)

pipe = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    return_full_text=False,
    do_sample=True,
    temperature=0.9,
    max_new_tokens=200,
)

def prompt_model():
    prompt = input("Enter your question: ")
    prompt = template.format(instruction=prompt)
    answer = pipe(prompt)
    print(answer[0]["generated_text"])

while True:
    prompt_model()
</code></pre><h2 id="gub-2">Gub</h2><p>Gub gub gub gub gub gub gub gub! Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub GUB gub gub Gub Gub Gub.</p><p>Gub gub gub gub gub gub gub gub, gub'gub gub Gub gub gub gub gub gub: <a href="https://gist.github.com/bgub/1da2c0064d53decf197a304267799708">https://gist.github.com/bgub/1da2c0064d53decf197a304267799708</a></p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub/gub</category>
            <category>gub-gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub: Gub Gub Gub Gub]]></title>
            <link>https://bgub.sh/posts/2023-10-16-gom-gpu-monitor-nvidia-smi-replacement?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2023-10-16-gom-gpu-monitor-nvidia-smi-replacement</guid>
            <pubDate>Mon, 16 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub `gom`, gub GUB gub gub gub GUB gub gub Gub gub.]]></description>
            <content:encoded><![CDATA[<link data-fig-hydration-skip rel="preload" href="/blog-images/gom-watch.png" as="image"><link data-fig-hydration-skip rel="preload" href="/blog-images/nvidia-smi.png" as="image"><article><h2 id="gubgub">Gub;Gub</h2><p><code>gom</code> gub gub GUB Gub Gub. Gub'gub gub gub gub gub gub gub GUB gub gub GUB gub. Gub gub gub gub <code>nvidia-smi</code>, gub gub gub gub gub. Gub gub gub gub gub gub: <strong>gub gub gub Gub gub gub gub Gub, gub gub gub gub gub gub gub</strong>! (Gub'gub gub, gub gub gub gub gub gub Gub gub gub gub Gub gub.)</p><p><em>Gub gub gub gub <a href="https://howe.vin/">Gub</a> gub gub gub gub gub. Gub gub GUB-4 gub gub gub gub gub gub Gub, gub Gub gub gub gub gub gub gub gub gub gub gub gub.</em></p><h2 id="gub">Gub</h2><ol><li>Gub <code>pip3 install gom</code></li><li>Gub gub gub GUB gub, gub gub gub gub gub <code>pynvml</code></li><li>Gub <code>gom show</code> (gub gub gub gub) gub <code>gom watch</code> (gub gub gub, gub gub gub gub)</li></ol><h2 id="gub-gom-gub-nvidia-smi">Gub <code>gom</code> Gub <code>nvidia-smi</code></h2><p>Gub gub gub gub gub gub gub :). Gub gub gub gub gub gub gub gub <code>gom watch</code>. Gub gub gub gub gub gub Gub gub, <code>r0</code>, <code>r1</code>, <code>r2</code>, gub <code>r3</code>, gub gub gub gub GUB gub gub. Gub'gub gub gub gub gub gub Gub gub'gub gub gub gub gub gub.</p><p><img src="/blog-images/gom-watch.png" alt="gub gub gub `gom watch` gub"></p><p>Gub gub gub gub gub gub gub gub <code>nvidia-smi</code>. Gub'gub gub gub gub gub. Gub gub gub gub <code>gom</code>, gub gub gub gub gub gub gub 8 Gub!</p><p><img src="/blog-images/nvidia-smi.png" alt="gub gub gub `nvidia-smi` gub"></p><h2 id="gub-1">Gub</h2><p>Gub gub <code>gom</code> gub Gub gub gub gub GUB gub gub gub Gub gub. Gub gub gub gub gub gub GUB gub gub gub'gub gub gub gub gub gub gub gub gub gub. Gub gub'gub gub gub gub. Gub gub gub gub, gub gub gub gub gub gub gub gub <a href="https://github.com/bgub/gom">Gub gub</a>.</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub/gub</category>
            <category>gub-gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub Gub Gub Gub: Gub 2]]></title>
            <link>https://bgub.sh/posts/2023-09-11-enroot-on-slurm-for-distributed-ml-part-2?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2023-09-11-enroot-on-slurm-for-distributed-ml-part-2</guid>
            <pubDate>Mon, 11 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub Gub gub Gub gub gub gub-gub gub.]]></description>
            <content:encoded><![CDATA[<article><p><em>GUB 2024: Gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub, Gub gub gub <a href="https://github.com/NVIDIA/pyxis">Gub</a>, gub gub gub gub GUB gub gub gub gub gub gub gub gub GUB gub</em>._</p><p><em>Gub gub gub 2 gub gub 2-gub gub. <a href="./enroot-on-slurm-for-distributed-ml-part-1">Gub 1</a> gub gub gub.</em></p><p>Gub <a href="./enroot-on-slurm-for-distributed-ml-part-1">gub 1</a>, gub gub gub gub gub Gub gub Gub gub gub <em>gub-gub</em> gub gub <code>salloc</code>. Gub gub gub, gub'gub gub gub gub gub Gub gub Gub gub gub <em>gub-gub</em> gub, gub gub gub gub <code>sbatch</code>.</p><h2 id="gub-1-gub-gub-gub">Gub 1: Gub Gub Gub</h2><p>Gub'gub gub gub gub gub Gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub Gub gub gub gub gub'gub gub gub <code>sbatch</code>. Gub gub gub gub gub gub gub gub gub gub <code>salloc</code> gub <a href="../enroot-on-slurm-for-distributed-ml-part-1">gub 1</a>, gub gub gub <code>#SBATCH</code> gub gub.</p><p><code>launch.sh</code></p><pre><code>#!/bin/bash
#SBATCH -J "JOBNAME"
#SBATCH --nodes=2
#SBATCH --gpus-per-node=8
#SBATCH --cpus-per-task=128
#SBATCH --mem=2000G
#SBATCH --time=72:00:00
#SBATCH --qos=&lt;qos&gt;

export CUR_DIR=$(pwd)
srun --nodes=2 stage1.sh
</code></pre><p>Gub gub gub gub gub gub <code>CUR_DIR</code> gub gub gub gub gub gub (gub gub gub gub <code>sbatch</code> gub gub gub). Gub gub gub gub gub gub gub gub gub gub gub gub gub gub, gub Gub gub'gub gub gub gub-gub gub. Gub gub'gub gub gub.</p><p>Gub gub gub gub gub gub gub gub gub gub <code>srun</code> gub, gub gub gub gub <code>stage1.sh</code> gub gub gub gub.</p><h2 id="gub-2-gub-gub-gub">Gub 2. Gub Gub Gub</h2><p>Gub, gub'gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub'gub gub gub gub <code>stage1.sh</code>.</p><p><code>stage1.sh</code></p><pre><code>#!/bin/bash

module load jq zstd pigz parallel libnvidia-container enroot

export MASTER_ADDR=$(scontrol show hostnames $SLURM_JOB_NODELIST | head -n 1) # get the IP address of the first node in the list
export MASTER_PORT=6000 # set the port to use for communication between nodes

enroot create --name image-name /path/to/image-name.sqsh

enroot start --env SLURM_NODEID \
             --env MASTER_ADDR \
             --env MASTER_PORT \
             --env SLURM_JOB_NAME \
             --env CUR_DIR \
             --mount /local/file/path:/image/file/path \
             --rw image-name \
             bash ${CUR_DIR}/stage2.sh
</code></pre><p>Gub gub gub gub gub gub gub gub gub gub Gub, gub gub <code>CUR_DIR</code>, gub gub gub. Gub <code>MASTER_ADDR</code> gub <code>MASTER_PORT</code> gub gub gub gub Gub'gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub gub gub gub gub gub (gub gub gub gub gub gub gub!).</p><h2 id="gub-3-gub-gub">Gub 3. Gub Gub</h2><p>Gub, gub'gub gub gub gub gub gub gub gub gub gub gub gub. Gub'gub gub gub gub <code>stage2.sh</code>.</p><p><code>stage2.sh</code></p><pre><code>#!/bin/bash

export NCCL_DEBUG=INFO # if you want to see NCCL logs
export NODE_RANK=$SLURM_NODEID # set the node rank to the node ID (0, 1, 2, etc.)
echo NODE_RANK: $NODE_RANK # print the node rank for debugging purposes

# Run training script
# NOTE: modify as desired if you're not using accelerate

accelerate launch --config_file ./accelerate_config.yaml --main_process_ip=$MASTER_ADDR --main_process_port=$MASTER_PORT --machine_rank $NODE_RANK ${CUR_DIR}/loop.py
</code></pre><p>Gub Gub'gub gub <a href="https://huggingface.co/docs/accelerate">gub</a> gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub!</p><p>Gub gub gub gub gub, gub'gub gub <code>accelerate_config.yaml</code> gub. Gub gub GUB (Gub Gub Gub Gub) gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub'gub gub gub gub gub GUB.</p><pre><code>compute_environment: LOCAL_MACHINE
deepspeed_config: {}
distributed_type: FSDP
downcast_bf16: "no"
fsdp_config:
  fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP
  fsdp_backward_prefetch_policy: BACKWARD_PRE
  fsdp_offload_params: false
  fsdp_sharding_strategy: 1
  fsdp_state_dict_type: FULL_STATE_DICT
  fsdp_transformer_layer_cls_to_wrap: LlamaDecoderLayer
main_training_function: main
mixed_precision: "no"
num_machines: 2
num_processes: 16 # 8 GPUs per node * 2 nodes = 16 processes
use_cpu: false
</code></pre><h2 id="gub-4-gub-gub-gub">Gub 4. Gub Gub Gub</h2><p>Gub gub gub'gub gub gub gub gub gub, gub gub gub gub gub gub Gub gub <code>sbatch</code>! Gub gub gub gub gub gub, gub:</p><pre><code>sbatch launch.sh
</code></pre><p>Gub gub gub gub gub gub Gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub <code>slurm-&lt;jobid&gt;.out</code> gub gub gub gub.</p><h2 id="gub">Gub</h2><p>Gub gub gub gub gub! Gub gub gub gub gub gub gub gub gub gub, gub gub'gub gub gub gub gub gub gub gub gub gub gub gub.</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub/gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub Gub Gub Gub: Gub 1]]></title>
            <link>https://bgub.sh/posts/2023-09-08-enroot-on-slurm-for-distributed-ml-part-1?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2023-09-08-enroot-on-slurm-for-distributed-ml-part-1</guid>
            <pubDate>Fri, 08 Sep 2023 22:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub Gub gub Gub gub gub gub-gub gub.]]></description>
            <content:encoded><![CDATA[<article><p><em>Gub gub gub 1 gub gub 2-gub gub. <a href="./enroot-on-slurm-for-distributed-ml-part-2">Gub 2</a> gub gub gub.</em></p><p>Gub gub gub gub Gub gub, gub gub gub gub gub Gub Gub Gub (GUB) gub gub gub gub <a href="https://slurm.schedmd.com/documentation.html">Gub Gub Gub</a>. Gub GUB gub GUB (Gub Gub Gub Gub) 7, gub gub gub gub gub gub gub. Gub gub'gub gub <code>sudo</code> gub gub gub'gub gub gub gub gub gub gub gub.</p><p>Gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub, gub'gub gub gub: gub.</p><p>Gub'gub gub Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub GUB, gub gub gub gub gub gub gub gub.</p><h2 id="gub-1-gub-gub-gub-gub-gub">Gub 1: Gub Gub Gub Gub Gub</h2><p>Gub gub gub gub <a href="./ultimate-ml-dockerfile">gub Gub gub Gub gub gub gub gub</a>, gub Gub gub'gub gub gub gub. Gub gub gub gub gub gub gub gub gub Gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub Gub 20.04 gub GUB 11.8.</p><h2 id="gub-2-gub-gub-gub-gub-gub">Gub 2: Gub Gub Gub Gub Gub</h2><p>Gub <a href="https://github.com/NVIDIA/enroot">Gub</a>, gub gub gub gub gub gub gub gub Gub gub gub gub gub gub:</p><pre><code>enroot import dockerd://&lt;image-name&gt;
</code></pre><p>Gub gub gub gub gub gub <code>&lt;image-name&gt;.sqsh</code> gub gub gub gub. Gub gub gub gub gub GUB gub <code>scp</code>.</p><h2 id="gub-3-gub-gub-gub-gub-gub-gub">Gub 3: Gub Gub Gub Gub Gub Gub</h2><p>Gub gub gub gub gub <code>salloc --nodes=1 --gpus=8 --qos=&lt;qos&gt; --mem=2000G --time=72:00:00 --ntasks=1 --cpus-per-task=128</code>.</p><p>Gub gub gub gub gub gub Gub gub:</p><pre><code>module load jq zstd pigz parallel libnvidia-container enroot
</code></pre><p>Gub gub GUB, gub gub gub gub gub gub gub:</p><pre><code>enroot create --name image-name /path/to/image-name.sqsh
</code></pre><p>Gub gub gub:</p><pre><code>enroot start --mount /local/file/path:/image/file/path \
             --rw image-name bash
</code></pre><p>Gub gub gub gub gub gub gub gub gub gub. Gub'gub gub gub <code>--rw</code> gub, gub gub gub gub gub gub. Gub gub gub gub gub <code>--mount</code> gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub gub gub gub, gub gub gub gub <code>--env</code> gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub, <code>--env SLURM_NODEID</code> gub gub gub gub <code>SLURM_NODEID</code> gub gub.</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub/gub</category>
        </item>
        <item>
            <title><![CDATA[Gub & Gub Gub Gub]]></title>
            <link>https://bgub.sh/posts/2023-09-08-quick-helpful-slurm-commands?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2023-09-08-quick-helpful-slurm-commands</guid>
            <pubDate>Fri, 08 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub gub gub Gub gub gub gub gub.]]></description>
            <content:encoded><![CDATA[<article><p>Gub gub gub Gub gub gub, gub gub gub gub gub Gub Gub Gub (GUB) gub gub gub gub <a href="https://slurm.schedmd.com/documentation.html">Gub Gub Gub</a>.</p><p>Gub'gub gub gub gub gub gub gub gub, gub Gub'gub gub gub gub gub gub Gub gub gub gub gub. Gub gub Gub'gub gub gub gub gub gub gub'gub gub gub gub gub.</p><h2 id="gub-gub-gub">Gub Gub Gub</h2><pre><code># View all jobs
squeue
# Check the status of just your jobs
squeue -u &lt;username&gt;
# Check the status of jobs with a specific QOS
squeue -q &lt;QOS&gt;
</code></pre><h2 id="gub-gub">Gub Gub</h2><pre><code># Cancel a specific job
scancel &lt;job_id&gt;
# Cancel all your jobs
scancel -u &lt;username&gt;
</code></pre><h2 id="gub-gub-gub-gub">Gub Gub Gub Gub</h2><pre><code># Requesting a single node (this will open it up interactively in your terminal)
# When you exit the terminal, the node will be reallocated
salloc --nodes=1 --gpus=8 --qos=&lt;QOS&gt; --mem=2000G --time=72:00:00 --ntasks=1 --cpus-per-task=128
</code></pre><h2 id="gub-gub-gub-1">Gub Gub Gub</h2><p>Gub gub gub gub gub gub gub gub gub, gub gub gub'gub gub gub gub gub gub gub gub gub gub gub gub gub gub? Gub gub gub, gub gub gub <code>sbatch</code> gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub <code>myjob.sh</code>. Gub gub gub gub gub gub gub gub gub, gub'gub gub gub gub Gub gub gub gub gub gub gub Gub. Gub'gub gub gub <code>run.sh</code>:</p><pre><code>#!/bin/bash
#SBATCH -J "JOBNAME"
#SBATCH --nodes=1
#SBATCH --gpus-per-node=8
#SBATCH --cpus-per-task=128
#SBATCH --mem=2000G
#SBATCH --time=72:00:00
#SBATCH --qos=&lt;QOS&gt;

srun --nodes=1 myjob.sh
</code></pre><p>Gub gub gub'gub gub gub <code>#SBATCH</code> gub gub gub gub gub gub gub gub gub gub gub gub gub <code>salloc</code> gub. Gub'gub gub gub <code>srun</code> gub gub gub gub gub; gub gub gub gub gub gub gub gub gub, gub gub gub gub.</p><p>Gub, gub gub gub gub, gub'gub gub:</p><pre><code>sbatch run.sh
</code></pre><h2 id="gub">Gub</h2><p>Gub'gub gub! Gub gub gub gub gub. Gub gub gub gub gub, gub gub gub Gub gub Gub (gub'gub gub gub gub gub gub gub gub gub, gub gub'gub gub gub gub!)</p><p>Gub gub gub gub gub gub <a href="https://slurm.schedmd.com/documentation.html">Gub gub</a> gub gub <a href="https://leo.leung.xyz/wiki/Slurm">Gub'gub gub</a> gub gub Gub gub gub gub.</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub/gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub Gub Gub Gub]]></title>
            <link>https://bgub.sh/posts/2023-09-08-ultimate-ml-dockerfile?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2023-09-08-ultimate-ml-dockerfile</guid>
            <pubDate>Fri, 08 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub Gub Gub gub gub gub gub gub gub gub gub.]]></description>
            <content:encoded><![CDATA[<article><p><em>GUB 2024: Gub'gub gub gub gub gub gub gub gub gub <code>nvcr.io/nvidia/pytorch</code> gub, gub Gub gub gub gub gub gub gub gub gub GUB + GUB + Gub gub. Gub gub gub gub gub gub gub gub gub gub <code>gom</code> gub GUB gub.</em></p><p>Gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub. Gub'gub gub gub gub Gub gub Gub gub gub gub gub gub gub gub gub. Gub'gub gub gub GUB'gub <code>pytorch</code> gub, gub Gub'gub gub gub gub gub (gub Gub gub, Gub GUB, Gub gub, <a href="./2023-10-16-gom-gpu-monitor-nvidia-smi-replacement">GUB gub</a>, gub.) gub Gub gub gub.</p><h2 id="gub">Gub</h2><p>Gub gub gub gub gub <code>Dockerfile</code> gub gub gub gub. Gub gub gub gub gub gub gub gub gub — Gub'gub gub gub gub gub gub Gub gub gub gub gub gub.</p><pre><code># Base image with Ubuntu 22.04, Python 3.10, CUDA 12.4
FROM nvcr.io/nvidia/pytorch:24.04-py3

#####################
# PYTHON PACKAGES   #
#####################

# Disable the "running pip as the 'root' user can..." warning
ENV PIP_ROOT_USER_ACTION=ignore

# Upgrade pip
RUN pip3 install --upgrade pip

# Upgrade &amp; install useful machine learning packages
RUN pip3 install --upgrade transformers accelerate deepspeed fire tqdm openai numpy rouge_score wandb ipython emoji tokenizers evaluate matplotlib seaborn lm-eval jupyter nltk tiktoken aiolimiter swifter pytorch-lightning lightning sentencepiece jsonargparse[signatures] bitsandbytes datasets zstandard rich transformer_lens librosa soundfile gom git+https://github.com/stanfordnlp/pyvene.git git+https://github.com/stanfordnlp/pyreft.git

# Install TorchAudio nightly
RUN pip3 install --no-deps torchaudio

# Fix incorrect Docker pip package, so gom works
RUN mv /usr/local/lib/python3.10/dist-packages/docker /usr/local/lib/python3.10/dist-packages/docker_old

#####################
# GH CLI &amp; STARSHIP #
#####################

# GitHub CLI
RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \
    &amp;&amp; chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \
    &amp;&amp; echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list &gt; /dev/null \
    &amp;&amp; apt-get update \
    &amp;&amp; apt-get install gh -y

RUN apt-get upgrade -y

# Starship Prompt
RUN curl -sS https://starship.rs/install.sh -o starship-install.sh 
RUN sh -posix starship-install.sh --yes
RUN echo 'eval "$(starship init bash)"' &gt;&gt; ~/.bashrc

# Starship Config
RUN echo $'[character]\n\
    success_symbol = "[λ](bold green) "\n\
    error_symbol = "[λ](bold red) "\n\
    \n\
    [aws]\n\
    disabled = true' &gt; /root/.config/starship.toml
</code></pre><h2 id="gub-gub-gub">Gub Gub Gub</h2><p>Gub gub'gub gub gub gub, gub gub gub gub gub gub:</p><pre><code>cd /path/to/directory
docker build -t YOUR_IMAGE_NAME_HERE .
</code></pre><h2 id="gub-gub-gub-1">Gub Gub Gub</h2><p>Gub gub gub gub gub gub:</p><pre><code>docker run -d --rm -it \
    --gpus all \
    --name YOUR_CONTAINER_NAME \
    --mount type=bind,source=YOUR_HOME_DIR,target=YOUR_HOME_DIR \
    -w YOUR_HOME_DIR \
    YOUR_IMAGE_NAME_HERE:latest
</code></pre></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub/gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub. Gub Gub. Gub]]></title>
            <link>https://bgub.sh/posts/2023-08-29-accelerate-deepspeed-fsdp?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2023-08-29-accelerate-deepspeed-fsdp</guid>
            <pubDate>Tue, 29 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub gub gub gub gub gub?]]></description>
            <content:encoded><![CDATA[<article><h2 id="gub">Gub</h2><p>Gub gub gub gub gub gub gub gub gub gub. Gub gub gub, gub'gub gub gub gub gub gub gub gub: <a href="https://huggingface.co/docs/accelerate/index">Gub</a>, <a href="https://www.deepspeed.ai/">Gub</a>, gub <a href="https://engineering.fb.com/2021/07/15/open-source/fsdp/">GUB</a>. Gub'gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub.</p><h2 id="gub-1">Gub</h2><p><a href="https://huggingface.co/docs/accelerate/index">Gub</a> gub gub gub gub gub gub gub gub Gub. Gub gub gub gub gub gub gub gub gub <code>torch.distributed</code>. Gub, gub gub gub gub gub gub gub gub <a href="./multi-gpu-inference-with-accelerate">gub</a> gub gub Gub gub gub.</p><p>Gub gub gub gub gub, gub gub Gub gub gub gub Gub gub gub gub GUB. Gub gub gub gub gub gub gub gub gub gub, Gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub gub gub gub gub gub gub GUB, gub gub gub Gub gub gub gub gub gub gub Gub gub gub <code>device_map="auto"</code> gub gub gub <code>from_pretrained</code> gub. Gub gub — gub gub gub gub <code>device_map="auto"</code> gub gub'gub gub gub <code>num_processes=1</code>, gub gub'gub gub gub gub gub.</p><p>Gub gub gub gub gub gub gub ("gub" gub gub gub gub gub gub gub) gub gub gub Gub gub GUB gub Gub</p><h2 id="gub-2">Gub</h2><p><a href="https://www.deepspeed.ai/">Gub</a> gub gub Gub Gub Gub (Gub). Gub'gub gub "Gub Gub" gub gub gub gub gub gub gub gub gub gub Gub gub gub gub gub gub gub'gub gub gub gub GUB. Gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub GUB.</p><p>Gub gub gub gub gub Gub:</p><ul><li><strong>Gub Gub 1</strong> gub gub gub</li><li><strong>Gub Gub 2</strong> gub gub gub</li><li><strong>Gub Gub 3</strong> gub gub gub</li></ul><p>Gub gub'gub gub gub gub gub gub, Gub gub gub gub gub gub gub gub, gub, gub gub gub gub gub GUB gub gub Gub gub. Gub gub gub "<strong>Gub-Gub</strong>," gub — gub gub gub gub gub gub gub — gub gub gub gub gub gub.</p><h2 id="gub-3">Gub</h2><p><a href="https://engineering.fb.com/2021/07/15/open-source/fsdp/">GUB</a> gub gub "Gub Gub Gub Gub." Gub gub gub gub gub Gub GUB Gub gub gub gub gub Gub gub, gub gub gub gub <a href="https://pytorch.org/blog/introducing-pytorch-fully-sharded-data-parallel-api/">gub gub gub Gub</a> gub Gub gub 1.11.</p><p>Gub gub gub gub gub gub gub Gub Gub — gub gub gub gub gub, gub, gub gub gub. Gub gub gub GUB gub. Gub gub gub gub gub gub gub gub gub gub gub-gub gub gub Gub.</p><h2 id="gub-4">Gub</h2><ul><li>Gub gub gub gub gub <code>torch.distributed</code> gub gub gub gub gub gub gub gub gub gub gub Gub gub gub. Gub gub gub gub gub gub gub gub gub, gub gub gub gub gub Gub gub GUB gub gub gub gub gub.</li><li>Gub gub GUB gub gub gub gub gub gub gub gub: gub gub gub, gub, gub gub gub gub gub Gub. Gub gub gub GUB gub gub gub gub gub gub gub gub Gub.</li></ul></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub/gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub Gub Gub Gub Gub (Gub) gub]]></title>
            <link>https://bgub.sh/posts/2023-08-23-llms-limitation-recursion?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2023-08-23-llms-limitation-recursion</guid>
            <pubDate>Wed, 23 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub GUB gub gub gub, gub'gub gub gub gub gub gub gub gub.]]></description>
            <content:encoded><![CDATA[<article><p><em>GUB 2024: Gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub, gub gub. Gub gub <a href="https://arxiv.org/abs/2405.17399v1">gub gub gub gub</a>, Gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub "gub" gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</em></p><h2 id="gub-gub">Gub Gub</h2><p>Gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub: gub'gub gub gub-gub gub gub. Gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub-gub. Gub gub gub gub gub gub gub gub gub.</p><p>Gub, gub gub gub gub gub gub gub gub gub gub gub. Gub gub. Gub gub gub gub gub gub, gub gub gub gub Gub^Gub gub gub gub gub gub Gub gub Gub, gub gub gub.</p><p>Gub gub gub gub gub gub gub gub gub gub gub, gub'gub gub gub gub gub, gub-gub gub gub gub gub gub gub gub gub (gub.gub., Gub^Gub gub gub gub gub gub Gub). Gub gub gub gub gub GUB gub "gub" gub gub gub gub gub gub gub gub gub gub.</p><h2 id="gub">Gub</h2><p>Gub gub gub gub gub gub gub gub gub gub GUB-gub Gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub, gub, gub gub'gub gub gub gub gub gub gub Gub! Gub'gub gub gub gub gub gub gub gub gub gub gub.</p><h2 id="gub-gub-1">Gub Gub</h2><p>Gub'gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub'gub gub gub Gub gub gub gub gub gub:</p><p>Gub Gub gub Gub gub 7^15 gub, gub gub gub gub <strong>170,859,375</strong>. Gub gub gub gub <strong>4,747,561,509,943</strong>.</p><p>Gub gub gub gub gub gub, <strong>170,859,375</strong> gub gub gub gub: gub gub gub <strong>(3^7)*(5^7)</strong>. Gub gub gub gub gub gub <strong>Gub^(Gub*Gub)</strong> gub <strong>(Gub^Gub)*(Gub^Gub)</strong> gub gub gub. Gub'gub gub gub gub gub gub gub gub!</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub/gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub Gub Gub Gub Gub]]></title>
            <link>https://bgub.sh/posts/2023-06-29-global-config-js?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2023-06-29-global-config-js</guid>
            <pubDate>Thu, 29 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub gub gub gub gub. Gub'gub gub gub.]]></description>
            <content:encoded><![CDATA[<article><p>Gub gub gub gub gub gub gub GUB gub gub gub gub, gub gub gub gub gub gub. Gub gub gub gub, gub gub <code>.eslintrc</code>, <code>next.config.js</code>, gub <code>tailwind.config.js</code>, gub gub gub gub gub-gub. Gub gub gub gub, Gub'gub gub gub gub gub gub gub gub gub gub gub gub gub gub <code>global.config.js</code>, gub gub gub gub gub gub.</p><h2 id="gub-gub-gub">Gub Gub Gub</h2><p>Gub Gub'gub gub gub gub gub, gub gub gub gub gub <code>.eslintrc.json</code>, <code>next.config.js</code>, <code>postcss.config.js</code>, <code>tailwind.config.js</code>, gub <code>tsconfig.json</code>. Gub gub gub gub gub gub-gub-gub-gub gub gub gub gub gub gub 30 gub, gub gub gub gub gub gub gub gub Gub gub gub gub gub gub'gub gub: gub gub gub.</p><p>Gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub <code>.babelrc</code>, <code>prettier.config.js</code>, <code>jest.config.js</code>, <code>cypress.json</code>, gub.</p><h2 id="gub-gub-globalconfigjs">Gub Gub: <code>global.config.js</code></h2><p>Gub'gub gub gub gub gub gub gub: gub gub gub gub gub gub gub <code>global.config.js</code>. Gub gub gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub (gub.gub. <code>tsconfig.json</code>), gub gub gub gub gub gub gub gub <code>global.config.js</code> gub gub gub gub gub gub gub gub.</p><p>Gub'gub gub gub gub <code>global.config.js</code> gub gub gub:</p><pre><code>module.exports = {
  eslint: {
    extends: ["next/core-web-vitals"]
  },
  postcss: {
    plugins: {
      tailwindcss: {},
      autoprefixer: {}
    }
  },
  tailwindcss: {
    content: ["./src/pages/**/*.{js,ts,jsx,tsx,mdx}"],
    theme: {
      extend: {
        backgroundImage: {
          "gradient-radial": "radial-gradient(var(--tw-gradient-stops))"
        }
      }
    },
    plugins: [require("@tailwindcss/typography")]
  }
}
</code></pre><h2 id="gub-gub-gub-gub">Gub Gub Gub Gub?</h2><p>Gub gub gub gub gub gub gub <code>global.config.js</code> gub gub gub gub gub gub, gub Gub gub Gub gub gub gub gub gub gub.</p><pre><code>module.exports = {
  // ...

  /** @type {import('tailwindcss').Config} */
  tailwindcss: {
    content: ["./src/pages/**/*.{js,ts,jsx,tsx,mdx}"],
    theme: {
      extend: {
        backgroundImage: {
          "gradient-radial": "radial-gradient(var(--tw-gradient-stops))"
        }
      }
    },
    plugins: [require("@tailwindcss/typography")]
  }
}
</code></pre><h2 id="gub-gub">Gub Gub</h2><p>Gub gub gub gub gub, gub gub GUB gub gub gub gub gub! Gub gub gub'gub, gub gub gub gub gub Gub. Gub gub'gub gub gub gub gub gub gub gub.</p></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub-gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub3]]></title>
            <link>https://bgub.sh/posts/2023-06-22-introducing-eta-v3?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2023-06-22-introducing-eta-v3</guid>
            <pubDate>Thu, 22 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub gub Gub, gub gub GUB gub gub, gub GUB gub gub gub.]]></description>
            <content:encoded><![CDATA[<article><h2 id="gub">Gub</h2><p>Gub, Gub gub gub gub gub gub gub gub gub-gub gub. Gub gub Gub gub gub gub 3 gub gub, gub gub'gub gub gub gub gub gub. Gub gub, Gub gub Gub gub gub gub-gub gub gub <a href="https://squirrelly.js.org">Gub</a>, gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub, Gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub-gub GUB gub gub gub gub gub gub Gub gub Gub. Gub'gub gub gub gub gub gub, gub, gub gub gub gub gub gub gub gub gub gub gub, gub gub gub, gub gub gub gub-GUB gub.</p><p>Gub gub gub gub, Gub gub gub gub gub gub gub gub gub, Gub gub, gub gub gub gub GUB. Gub gub gub, Gub gub gub gub Gub gub gub gub. Gub gub gub gub gub, gub gub, gub gub gub.</p><p>Gub gub gub gub gub gub gub gub gub gub gub gub gub, Gub gub gub gub gub gub gub Gub gub. Gub gub gub gub gub gub gub gub gub gub, gub gub gub gub, GUB, gub gub.</p><h2 id="gub-gub-gub">Gub Gub Gub</h2><p>Gub Gub'gub gub gub gub, gub gub gub gub gub. Gub gub gub gub gub gub gub. Gub gub gub, gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub Gub.</p><p>Gub gub gub 3:</p><ul><li>Gub <a href="https://github.com/developit/microbundle">gub</a> gub gub gub gub gub gub gub gub gub gub gub gub gub.</li><li>Gub Gub Gub gub gub gub gub gub gub gub gub gub gub gub gub Gub gub.</li><li>Gub gub <code>allowImportingTsExtensions: true</code> gub <code>tsconfig.json</code>, Gub gub gub gub gub gub <a href="https://github.com/garronej/denoify">Gub</a> gub gub gub Gub gub.</li></ul><h2 id="gub-gub">Gub Gub</h2><p>Gub gub gub gub GUB. Gub gub gub <code>eta.render()</code> gub gub gub gub, gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub-gub gub gub <code>render</code>, <code>parse</code>, gub <code>compile</code>. Gub gub, gub gub gub gub-gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub gub.</p><p>Gub gub gub 3:</p><ul><li>Gub'gub gub gub gub, gub gub gub gub <code>Eta</code>. Gub gub gub gub gub gub, gub gub gub gub gub gub gub gub gub gub gub gub.</li><li>Gub <code>render()</code> gub <code>renderAsync()</code> gub gub gub gub gub gub gub.<ul><li>Gub Gub gub2, <code>render()</code> gub <code>renderAsync()</code> gub gub gub gub gub gub gub gub gub gub gub. Gub gub3 gub gub gub gub gub gub gub gub: <code>renderString()</code> gub <code>renderStringAsync()</code>.</li></ul></li><li>Gub <code>readFile()</code> gub <code>resolvePath()</code> gub, gub Gub gub gub, gub gub gub gub gub gub gub gub gub.</li><li>Gub gub gub gub gub gub gub gub gub gub gub gub <code>__eta</code> gub, gub gub gub gub gub gub <code>__res</code>.</li><li>Gub gub gub gub gub gub gub <code>root</code> gub gub gub <code>views</code> gub, gub gub gub gub gub gub <code>views</code> gub. Gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub gub gub gub, gub gub gub gub gub gub gub-gub gub.</li></ul><h2 id="gub-gub-gub-1">Gub Gub Gub</h2><p>Gub gub gub gub gub gub Gub gub3 gub gub gub gub gub gub gub (gub gub GUB). Gub gub gub gub gub gub, gub gub gub gub gub gub gub gub:</p><pre><code>Template header
&lt;%= undefinedVariable %&gt;
Lorem Ipsum
</code></pre><p>Gub gub2 gub gub gub gub gub gub gub gub, gub gub gub'gub gub gub. Gub gub, Gub gub3 gub gub gub gub gub gub gub gub, gub gub, gub gub gub:</p><pre><code>EtaError [ReferenceError]: .../my-dir/templates/runtime-error.eta:2
    1| Template header
 &gt;&gt; 2| &lt;%= undefinedVariable %&gt;
    3| Lorem Ipsum

undefinedVariable is not defined
</code></pre><h2 id="gub-gub-1">Gub Gub</h2><p>Gub gub gub Gub gub2 gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub 40+ (!) gub gub, gub gub gub gub gub gub 3 gub gub gub.</p><p>Gub gub gub Gub gub3 gub gub 9 gub, gub gub gub gub gub gub gub gub gub (<a href="https://eta.js.org">gub.gub.gub</a>). Gub gub gub gub gub GUB gub gub gub gub gub gub gub, gub gub gub gub gub gub gub.</p><h2 id="gub-gub-gub-gub">Gub Gub Gub Gub</h2><p>Gub'gub gub gub gub gub gub gub Gub gub3, gub gub gub gub gub gub gub. Gub gub gub gub gub gub gub gub gub gub Gub, gub, gub gub. Gub gub gub gub gub <a href="https://github.com/mde/ejs">gub</a>, gub gub Gub gub gub gub gub.</p><p>Gub gub Gub gub gub gub-gub gub gub gub, gub Gub'gub gub gub gub gub gub gub gub gub gub. Gub'gub gub gub gub gub gub gub gub gub gub gub3, gub Gub gub gub gub gub gub Gub gub gub gub gub gub gub gub gub.</p><h2 id="gub-1">Gub</h2><ul><li><a href="https://github.com/eta-dev/eta">Gub gub Gub</a></li><li><a href="https://www.npmjs.com/package/eta">Gub gub gub</a></li><li><a href="https://eta.js.org">Gub gub gub gub</a></li></ul></article>]]></content:encoded>
            <author>Gub Gub</author>
            <category>gub-gub</category>
        </item>
        <item>
            <title><![CDATA[Gub Gub Gub Gub]]></title>
            <link>https://bgub.sh/posts/2023-05-06-my-new-website?utm_campaign=feed&amp;utm_source=rss</link>
            <guid isPermaLink="false">https://bgub.sh/posts/2023-05-06-my-new-website</guid>
            <pubDate>Sat, 06 May 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Gub gub gub gub-gub gub gub gub Gub.gub, Gub GUB, gub GUB.]]></description>
            <content:encoded><![CDATA[<article><p>Gub'gub gub gub gub gub gub gub gub gub gub gub gub!</p><p>Gub gub gub gub gub <a href="https://nextjs.org/">Gub.gub 13</a>, gub gub gub Gub Gub gub. Gub gub Gub gub gub <a href="https://tailwindcss.com/">Gub GUB</a>, <a href="https://mdxjs.com/">GUB</a>, gub <a href="https://github.com/code-hike/bright">Gub</a>. Gub'gub gub gub gub <a href="https://vercel.com/">Gub</a>.</p><p>Gub gub gub gub gub gub gub gub gub gub gub gub gub. Gub gub gub, gub gub gub gub gub <a href="https://github.com/bgub/bengubler.com">gub gub</a>.</p><p>Gub'gub gub gub gub gub Gub gub gub <a href="https://nextjs.org/learn/basics/create-nextjs-app">gub</a>, gub Gub gub gub; <a href="https://maxleiter.com/blog/build-a-blog-with-nextjs-13#sitemap-support-sitemapjs">gub gub gub gub gub Gub Gub</a>, gub gub gub gub Gub Gub gub; gub gub <a href="https://precedent.dev/">Gub gub</a>, gub gub Gub gub gub gub gub.</p></article>]]></content:encoded>
            <author>Gub Gub</author>
        </item>
    </channel>
</rss>