diff options
| author | Paul Buetow <paul@buetow.org> | 2026-06-06 08:54:53 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-06-06 08:54:53 +0300 |
| commit | 5c52f44108dfe6b175417a49fade3ece93762043 (patch) | |
| tree | d8f2cfee65e0732066f434cbc676306a644593d3 | |
| parent | 70db2e5bb6fbdb7a89d2cd425225d9a3e4f7ae5a (diff) | |
Update content for html
| -rw-r--r-- | gemfeed/2024-07-05-random-weird-things.html | 1 | ||||
| -rw-r--r-- | gemfeed/2025-02-08-random-weird-things-ii.html | 1 | ||||
| -rw-r--r-- | gemfeed/2025-08-15-random-weird-things-iii.html | 1 | ||||
| -rw-r--r-- | gemfeed/2026-06-06-random-weird-things-iv.html (renamed from gemfeed/DRAFT-random-weird-things-vi.html) | 53 | ||||
| -rw-r--r-- | gemfeed/atom.xml | 409 | ||||
| -rw-r--r-- | gemfeed/index.html | 1 | ||||
| -rw-r--r-- | index.html | 3 | ||||
| -rw-r--r-- | uptime-stats.html | 70 |
8 files changed, 292 insertions, 247 deletions
diff --git a/gemfeed/2024-07-05-random-weird-things.html b/gemfeed/2024-07-05-random-weird-things.html index 9f25539a..16a86f27 100644 --- a/gemfeed/2024-07-05-random-weird-things.html +++ b/gemfeed/2024-07-05-random-weird-things.html @@ -20,6 +20,7 @@ <a class='textlink' href='./2024-07-05-random-weird-things.html'>2024-07-05 Random Weird Things - Part Ⅰ (You are currently reading this)</a><br /> <a class='textlink' href='./2025-02-08-random-weird-things-ii.html'>2025-02-08 Random Weird Things - Part Ⅱ</a><br /> <a class='textlink' href='./2025-08-15-random-weird-things-iii.html'>2025-08-15 Random Weird Things - Part Ⅲ</a><br /> +<a class='textlink' href='./2026-06-06-random-weird-things-iv.html'>2026-06-06 Random Weird Things - Part Ⅳ</a><br /> <br /> <pre> /\_/\ diff --git a/gemfeed/2025-02-08-random-weird-things-ii.html b/gemfeed/2025-02-08-random-weird-things-ii.html index 1b8260fc..57e7c232 100644 --- a/gemfeed/2025-02-08-random-weird-things-ii.html +++ b/gemfeed/2025-02-08-random-weird-things-ii.html @@ -20,6 +20,7 @@ <a class='textlink' href='./2024-07-05-random-weird-things.html'>2024-07-05 Random Weird Things - Part Ⅰ</a><br /> <a class='textlink' href='./2025-02-08-random-weird-things-ii.html'>2025-02-08 Random Weird Things - Part Ⅱ (You are currently reading this)</a><br /> <a class='textlink' href='./2025-08-15-random-weird-things-iii.html'>2025-08-15 Random Weird Things - Part Ⅲ</a><br /> +<a class='textlink' href='./2026-06-06-random-weird-things-iv.html'>2026-06-06 Random Weird Things - Part Ⅳ</a><br /> <br /> <pre> /\_/\ /\_/\ diff --git a/gemfeed/2025-08-15-random-weird-things-iii.html b/gemfeed/2025-08-15-random-weird-things-iii.html index 148d160c..3e74ccf7 100644 --- a/gemfeed/2025-08-15-random-weird-things-iii.html +++ b/gemfeed/2025-08-15-random-weird-things-iii.html @@ -20,6 +20,7 @@ <a class='textlink' href='./2024-07-05-random-weird-things.html'>2024-07-05 Random Weird Things - Part Ⅰ</a><br /> <a class='textlink' href='./2025-02-08-random-weird-things-ii.html'>2025-02-08 Random Weird Things - Part Ⅱ</a><br /> <a class='textlink' href='./2025-08-15-random-weird-things-iii.html'>2025-08-15 Random Weird Things - Part Ⅲ (You are currently reading this)</a><br /> +<a class='textlink' href='./2026-06-06-random-weird-things-iv.html'>2026-06-06 Random Weird Things - Part Ⅳ</a><br /> <br /> <pre> /\_/\ /\_/\ /\_/\ diff --git a/gemfeed/DRAFT-random-weird-things-vi.html b/gemfeed/2026-06-06-random-weird-things-iv.html index 25e00855..99465bdb 100644 --- a/gemfeed/DRAFT-random-weird-things-vi.html +++ b/gemfeed/2026-06-06-random-weird-things-iv.html @@ -9,16 +9,19 @@ </head> <body> <p class="header"> -<a href="https://foo.zone">Home</a> | <a href="https://codeberg.org/snonux/foo.zone/src/branch/content-md/gemfeed/DRAFT-random-weird-things-vi.md">Markdown</a> | <a href="gemini://foo.zone/gemfeed/DRAFT-random-weird-things-vi.gmi">Gemini</a> | <a href="https://snonux.foo">Microblog</a> | <a href="https://irregular.ninja">Street photography</a> +<a href="https://foo.zone">Home</a> | <a href="https://codeberg.org/snonux/foo.zone/src/branch/content-md/gemfeed/2026-06-06-random-weird-things-iv.md">Markdown</a> | <a href="gemini://foo.zone/gemfeed/2026-06-06-random-weird-things-iv.gmi">Gemini</a> | <a href="https://snonux.foo">Microblog</a> | <a href="https://irregular.ninja">Street photography</a> </p> <h1 style='display: inline' id='random-weird-things---part-'>Random Weird Things - Part Ⅳ</h1><br /> <br /> +<span class='quote'>Published at 2026-06-06T08:54:00+03:00</span><br /> +<br /> <span>Every so often I stumble upon random, weird, and completely unexpected things on the internet. I thought it would be neat to share them here from time to time. This is the fourth run.</span><br /> <br /> <pre> /\_/\ /\_/\ /\_/\ ( o.o ) ( o.o ) ( o.o ) - > ^ < > ^ < > ^ < + > ^ < > ^ < > ^ < + /\_/\ Miaaauuuu.... ( o.o ) > ^ < @@ -27,6 +30,7 @@ <a class='textlink' href='./2024-07-05-random-weird-things.html'>2024-07-05 Random Weird Things - Part Ⅰ</a><br /> <a class='textlink' href='./2025-02-08-random-weird-things-ii.html'>2025-02-08 Random Weird Things - Part Ⅱ</a><br /> <a class='textlink' href='./2025-08-15-random-weird-things-iii.html'>2025-08-15 Random Weird Things - Part Ⅲ</a><br /> +<a class='textlink' href='./2026-06-06-random-weird-things-iv.html'>2026-06-06 Random Weird Things - Part Ⅳ (You are currently reading this)</a><br /> <br /> <h2 style='display: inline' id='table-of-contents'>Table of Contents</h2><br /> <br /> @@ -59,7 +63,7 @@ <br /> <h2 style='display: inline' id='33-llm-via-dns'>33. LLM via DNS</h2><br /> <br /> -<span>You can query an LLM using nothing but DNS. Just run <span class='inlinecode'>dig @ch.at "what is golang" TXT +short</span> and you get back an answer in the TXT records. No browser, no API key. It even works over SSH tunnels. I tried it on a server with zero internet tools installed and it just worked.</span><br /> +<span>You can query an LLM using nothing but DNS. Just run <span class='inlinecode'>dig @ch.at "what is golang" TXT +short</span> and you get back an answer in the TXT records. No browser, no API key. It even works over SSH tunnels.</span><br /> <br /> <!-- Generator: GNU source-highlight 3.1.9 by Lorenzo Bettini @@ -77,7 +81,7 @@ http://www.gnu.org/software/src-highlite --> <br /> <h2 style='display: inline' id='34-black-hole-in-125-bytes'>34. Black Hole in ~125 Bytes</h2><br /> <br /> -<span>This tiny HTML/JS snippet (under 125 bytes) renders a swirling black hole in your browser tab. No frameworks, no libraries, just code-golf magic. I stared at it way longer than I care to admit.</span><br /> +<span>Thi le in your browser tab. No frameworks, no libraries, just code-golf magic. I stared at it way longer than I care to admit.</span><br /> <br /> <a class='textlink' href='https://aem1k.com/blackhole/'>Black Hole</a><br /> <br /> @@ -90,7 +94,15 @@ http://www.gnu.org/software/src-highlite --> <br /> <h2 style='display: inline' id='36-llm-rescuer-'>36. LLM Rescuer 🤖💰</h2><br /> <br /> -<span>LLM Rescuer is a tiny Ruby wrapper that retries, sanitizes outputs, handles errors, and has some token-saving logic so you don't burn through your budget. It interprets nil references automatically based on the context. Examples:</span><br /> +<span>LLM Rescuer is a tiny Ruby gem that hooks into Ruby's method dispatch so that calling a method on <span class='inlinecode'>nil</span> doesn't crash — it asks an LLM what the return value should be instead. When a <span class='inlinecode'>NoMethodError</span> would normally explode, the gem catches it, packages up the context (what method was called, what the variable name suggests, maybe the surrounding code), fires that off to an actual LLM API, and returns whatever the model hallucinates as sensible.</span><br /> +<br /> +<span>So <span class='inlinecode'>user.email</span> on a nil <span class='inlinecode'>user</span> doesn't die. It asks the LLM "someone called <span class='inlinecode'>.email</span> on a <span class='inlinecode'>user</span> that turned out to be nil, what should I return?" and the model says "probably <span class='inlinecode'>'no-reply@example.com'</span>". The gem swallows the error and hands you that string.</span><br /> +<br /> +<span>It tries to keep API costs down by sending only minimal context — just the method name and variable name rather than your whole codebase — but every nil-hit still costs tokens and adds latency.</span><br /> +<br /> +<span>This is runtime monkey-patching powered by a remote AI. Your nil bugs don't crash, they silently return AI-guessed values. In production this would be a debugging nightmare.</span><br /> +<br /> +<span>Examples:</span><br /> <br /> <!-- Generator: GNU source-highlight 3.1.9 by Lorenzo Bettini @@ -118,7 +130,36 @@ answer = meaning_of_life.to_i <br /> <h2 style='display: inline' id='37-filesystem-backed-by-an-llm'>37. Filesystem Backed by an LLM</h2><br /> <br /> -<span>Mount a folder, and every time you read or write a file, an LLM decides what the contents should be. Want a config file? Ask the LLM. Need a todo list that rewrites itself when you look at it? There you go. There's a working FUSE implementation. Equal parts brilliant and terrifying.</span><br /> +<span>Mount a folder via FUSE, and every time you read or write a file, an LLM decides what the contents should be. There's a real working implementation. You literally <span class='inlinecode'>cat</span> a file and the LLM generates the output on the fly.</span><br /> +<br /> +<span>Example usage:</span><br /> +<br /> +<!-- Generator: GNU source-highlight 3.1.9 +by Lorenzo Bettini +http://www.lorenzobettini.it +http://www.gnu.org/software/src-highlite --> +<pre>$ echo <font color="#808080">"a nginx config for a reverse proxy to localhost:8080"</font> > /mnt/llmfs/nginx.conf +$ cat /mnt/llmfs/nginx.conf +server { + listen <font color="#000000">80</font>; + location / { + proxy_pass http://localhost:<font color="#000000">8080</font>; + } +} + +$ echo <font color="#808080">"my todo list for today"</font> > /mnt/llmfs/todo.txt +$ cat /mnt/llmfs/todo.txt +- Write blog post +- Fix that bug <b><u><font color="#000000">in</font></u></b> prod +- Drink coffee + +$ cat /mnt/llmfs/todo.txt +- Write blog post (<b><u><font color="#000000">done</font></u></b>?) +- Fix that bug <b><u><font color="#000000">in</font></u></b> prod +- Drink more coffee +</pre> +<br /> +<span>The LLM hallucinates the file contents every single read. Your todo list literally mutates when you look at it. Want a config file? Just describe it in the filename or write a prompt into it. Equal parts brilliant and terrifying.</span><br /> <br /> <a class='textlink' href='https://healeycodes.com/filesystem-backed-by-an-llm'>Filesystem Backed by an LLM</a><br /> <br /> diff --git a/gemfeed/atom.xml b/gemfeed/atom.xml index e6ae257e..b168f2b4 100644 --- a/gemfeed/atom.xml +++ b/gemfeed/atom.xml @@ -1,12 +1,212 @@ <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> - <updated>2026-05-31T22:32:28+03:00</updated> + <updated>2026-06-06T08:54:01+03:00</updated> <title>foo.zone feed</title> <subtitle>To be in the .zone!</subtitle> <link href="https://foo.zone/gemfeed/atom.xml" rel="self" /> <link href="https://foo.zone/" /> <id>https://foo.zone/</id> <entry> + <title>Random Weird Things - Part Ⅳ</title> + <link href="https://foo.zone/gemfeed/2026-06-06-random-weird-things-iv.html" /> + <id>https://foo.zone/gemfeed/2026-06-06-random-weird-things-iv.html</id> + <updated>2026-06-06T08:54:00+03:00</updated> + <author> + <name>Paul Buetow aka snonux</name> + <email>paul@dev.buetow.org</email> + </author> + <summary>Every so often I stumble upon random, weird, and completely unexpected things on the internet. I thought it would be neat to share them here from time to time. This is the fourth run.</summary> + <content type="xhtml"> + <div xmlns="http://www.w3.org/1999/xhtml"> + <h1 style='display: inline' id='random-weird-things---part-'>Random Weird Things - Part Ⅳ</h1><br /> +<br /> +<span>Every so often I stumble upon random, weird, and completely unexpected things on the internet. I thought it would be neat to share them here from time to time. This is the fourth run.</span><br /> +<br /> +<pre> + /\_/\ /\_/\ /\_/\ + ( o.o ) ( o.o ) ( o.o ) + > ^ < > ^ < > ^ < + + /\_/\ Miaaauuuu.... + ( o.o ) + > ^ < +</pre> +<br /> +<a class='textlink' href='./2024-07-05-random-weird-things.html'>2024-07-05 Random Weird Things - Part Ⅰ</a><br /> +<a class='textlink' href='./2025-02-08-random-weird-things-ii.html'>2025-02-08 Random Weird Things - Part Ⅱ</a><br /> +<a class='textlink' href='./2025-08-15-random-weird-things-iii.html'>2025-08-15 Random Weird Things - Part Ⅲ</a><br /> +<a class='textlink' href='./2026-06-06-random-weird-things-iv.html'>2026-06-06 Random Weird Things - Part Ⅳ (You are currently reading this)</a><br /> +<br /> +<h2 style='display: inline' id='table-of-contents'>Table of Contents</h2><br /> +<br /> +<ul> +<li><a href='#random-weird-things---part-'>Random Weird Things - Part Ⅳ</a></li> +<li>⇢ <a href='#31-gui-apps-in-your-terminal'>31. GUI Apps in Your Terminal</a></li> +<li>⇢ <a href='#32-templeos'>32. TempleOS</a></li> +<li>⇢ <a href='#33-llm-via-dns'>33. LLM via DNS</a></li> +<li>⇢ <a href='#34-black-hole-in-125-bytes'>34. Black Hole in ~125 Bytes</a></li> +<li>⇢ <a href='#35-loss32-win32-on-linux'>35. loss32: Win32 on Linux</a></li> +<li>⇢ <a href='#36-llm-rescuer-'>36. LLM Rescuer 🤖💰</a></li> +<li>⇢ <a href='#37-filesystem-backed-by-an-llm'>37. Filesystem Backed by an LLM</a></li> +<li>⇢ <a href='#38-qr-code-with-pure-sql-in-postgres'>38. QR Code with Pure SQL in Postgres</a></li> +<li>⇢ <a href='#39-the-sl-train-in-your-terminal'>39. The SL Train in Your Terminal</a></li> +<li>⇢ <a href='#40-url-in-c-code-puzzle'>40. URL in C Code Puzzle</a></li> +</ul><br /> +<h2 style='display: inline' id='31-gui-apps-in-your-terminal'>31. GUI Apps in Your Terminal</h2><br /> +<br /> +<span>term.everything is a from-scratch Wayland compositor that renders GUI apps inside your terminal. GTK, Qt, whatever — it just grabs it and draws it right there. You can run Firefox or GIMP over SSH and interact with it using your mouse. No X forwarding, no latency nonsense. It actually works.</span><br /> +<br /> +<a href='./random-weird-things-iv/term-everything.jpg'><img alt='term.everything demo' title='term.everything demo' src='./random-weird-things-iv/term-everything.jpg' /></a><br /> +<a class='textlink' href='https://github.com/mmulet/term.everything'>term.everything</a><br /> +<br /> +<h2 style='display: inline' id='32-templeos'>32. TempleOS</h2><br /> +<br /> +<span>Terry A. Davis spent years single-handedly building a complete 64-bit operating system from scratch because God told him to. It runs at 640×480, uses a custom language called HolyC, has its own compiler, and is designed as a temple. Boot it up and you get scripture, a talking parrot, and probably the weirdest OS you'll ever see. One of the most fascinating stories in computing.</span><br /> +<br /> +<a href='./random-weird-things-iv/templeos.png'><img alt='TempleOS screenshot' title='TempleOS screenshot' src='./random-weird-things-iv/templeos.png' /></a><br /> +<a class='textlink' href='https://templeos.org'>TempleOS</a><br /> +<br /> +<h2 style='display: inline' id='33-llm-via-dns'>33. LLM via DNS</h2><br /> +<br /> +<span>You can query an LLM using nothing but DNS. Just run <span class='inlinecode'>dig @ch.at "what is golang" TXT +short</span> and you get back an answer in the TXT records. No browser, no API key. It even works over SSH tunnels.</span><br /> +<br /> +<!-- Generator: GNU source-highlight 3.1.9 +by Lorenzo Bettini +http://www.lorenzobettini.it +http://www.gnu.org/software/src-highlite --> +<pre>$ dig @ch.at <font color="#808080">"what is golang"</font> TXT +short +<font color="#808080">"Golang, or Go, is an open-source programming language developed by Google.</font> +<font color="#808080">It was created to simplify the development of reliable and efficient software.</font> +<font color="#808080">Go is known for its simplicity, strong concurrency support, and performance</font> +<font color="#808080">comparable to C or C++. I"</font> <font color="#808080">"t features garbage collection, type safety, and</font> +<font color="#808080">built-in support for concurrent programming through goroutines and channels.</font> +<font color="#808080">Go is widely used for web servers, cloud services, and distributed systems due</font> +<font color="#808080">to its efficiency and ease of deployme..."</font> +</pre> +<br /> +<h2 style='display: inline' id='34-black-hole-in-125-bytes'>34. Black Hole in ~125 Bytes</h2><br /> +<br /> +<span>Thi le in your browser tab. No frameworks, no libraries, just code-golf magic. I stared at it way longer than I care to admit.</span><br /> +<br /> +<a class='textlink' href='https://aem1k.com/blackhole/'>Black Hole</a><br /> +<br /> +<h2 style='display: inline' id='35-loss32-win32-on-linux'>35. loss32: Win32 on Linux</h2><br /> +<br /> +<span>loss32 is a Linux distro where the entire desktop is classic Win32 apps running natively. ReactOS + WINE on steroids. You get the Windows 98/2000 vibe on a modern Linux kernel. It's not trying to be practical — it's pure nostalgia for people who miss the old Windows desktop but don't want the actual Windows.</span><br /> +<br /> +<a href='./random-weird-things-iv/loss32.png'><img alt='loss32 desktop screenshot' title='loss32 desktop screenshot' src='./random-weird-things-iv/loss32.png' /></a><br /> +<a class='textlink' href='https://loss32.org/'>loss32</a><br /> +<br /> +<h2 style='display: inline' id='36-llm-rescuer-'>36. LLM Rescuer 🤖💰</h2><br /> +<br /> +<span>LLM Rescuer is a tiny Ruby gem that hooks into Ruby's method dispatch so that calling a method on <span class='inlinecode'>nil</span> doesn't crash — it asks an LLM what the return value should be instead. When a <span class='inlinecode'>NoMethodError</span> would normally explode, the gem catches it, packages up the context (what method was called, what the variable name suggests, maybe the surrounding code), fires that off to an actual LLM API, and returns whatever the model hallucinates as sensible.</span><br /> +<br /> +<span>So <span class='inlinecode'>user.email</span> on a nil <span class='inlinecode'>user</span> doesn't die. It asks the LLM "someone called <span class='inlinecode'>.email</span> on a <span class='inlinecode'>user</span> that turned out to be nil, what should I return?" and the model says "probably <span class='inlinecode'>'no-reply@example.com'</span>". The gem swallows the error and hands you that string.</span><br /> +<br /> +<span>It tries to keep API costs down by sending only minimal context — just the method name and variable name rather than your whole codebase — but every nil-hit still costs tokens and adds latency.</span><br /> +<br /> +<span>This is runtime monkey-patching powered by a remote AI. Your nil bugs don't crash, they silently return AI-guessed values. In production this would be a debugging nightmare.</span><br /> +<br /> +<span>Examples:</span><br /> +<br /> +<!-- Generator: GNU source-highlight 3.1.9 +by Lorenzo Bettini +http://www.lorenzobettini.it +http://www.gnu.org/software/src-highlite --> +<pre><i><font color="silver"># Classic nil safety</font></i> +user = find_user(id: <font color="#808080">"nonexistent"</font>) <i><font color="silver"># returns nil</font></i> +puts user.email +<i><font color="silver"># AI: "Analyzing context... user seems to need an email...</font></i> +<i><font color="silver"># returning 'no-reply@example.com'"</font></i> + +<i><font color="silver"># Shopping cart magic</font></i> +cart = session[:cart] <i><font color="silver"># nil because session expired</font></i> +total = cart.total_price +<i><font color="silver"># AI: "This looks like e-commerce. Based on similar patterns,</font></i> +<i><font color="silver"># I'll return 0.0 to avoid charging $nil"</font></i> + +<i><font color="silver"># The existential crisis</font></i> +meaning_of_life = <b><u><font color="#000000">nil</font></u></b> +answer = meaning_of_life.to_i +<i><font color="silver"># AI: "Clearly this should be 42. I've read Douglas Adams."</font></i> +</pre> +<br /> +<a class='textlink' href='https://github.com/barodeur/llm_rescuer'>LLM Rescuer</a><br /> +<br /> +<h2 style='display: inline' id='37-filesystem-backed-by-an-llm'>37. Filesystem Backed by an LLM</h2><br /> +<br /> +<span>Mount a folder via FUSE, and every time you read or write a file, an LLM decides what the contents should be. There's a real working implementation. You literally <span class='inlinecode'>cat</span> a file and the LLM generates the output on the fly.</span><br /> +<br /> +<span>Example usage:</span><br /> +<br /> +<!-- Generator: GNU source-highlight 3.1.9 +by Lorenzo Bettini +http://www.lorenzobettini.it +http://www.gnu.org/software/src-highlite --> +<pre>$ echo <font color="#808080">"a nginx config for a reverse proxy to localhost:8080"</font> > /mnt/llmfs/nginx.conf +$ cat /mnt/llmfs/nginx.conf +server { + listen <font color="#000000">80</font>; + location / { + proxy_pass http://localhost:<font color="#000000">8080</font>; + } +} + +$ echo <font color="#808080">"my todo list for today"</font> > /mnt/llmfs/todo.txt +$ cat /mnt/llmfs/todo.txt +- Write blog post +- Fix that bug <b><u><font color="#000000">in</font></u></b> prod +- Drink coffee + +$ cat /mnt/llmfs/todo.txt +- Write blog post (<b><u><font color="#000000">done</font></u></b>?) +- Fix that bug <b><u><font color="#000000">in</font></u></b> prod +- Drink more coffee +</pre> +<br /> +<span>The LLM hallucinates the file contents every single read. Your todo list literally mutates when you look at it. Want a config file? Just describe it in the filename or write a prompt into it. Equal parts brilliant and terrifying.</span><br /> +<br /> +<a class='textlink' href='https://healeycodes.com/filesystem-backed-by-an-llm'>Filesystem Backed by an LLM</a><br /> +<br /> +<h2 style='display: inline' id='38-qr-code-with-pure-sql-in-postgres'>38. QR Code with Pure SQL in Postgres</h2><br /> +<br /> +<span>Someone generated a full QR code using nothing but SQL queries inside PostgreSQL. No extensions, no external tools — just raw Postgres doing things it was never meant to do. I ran the example and watched a QR code materialize in the query result. Mad stuff.</span><br /> +<br /> +<a href='./random-weird-things-iv/pqr.webp'><img alt='QR code generated with pure SQL' title='QR code generated with pure SQL' src='./random-weird-things-iv/pqr.webp' /></a><br /> +<a class='textlink' href='https://tanelpoder.com/posts/generate-qr-code-with-pure-sql-in-postgres/'>Pure SQL QR Code</a><br /> +<br /> +<h2 style='display: inline' id='39-the-sl-train-in-your-terminal'>39. The SL Train in Your Terminal</h2><br /> +<br /> +<span>You mistype <span class='inlinecode'>ls</span> as <span class='inlinecode'>sl</span> and a steam locomotive comes chugging across your terminal. The SL program has been around for decades and it still cracks me up. There's even a flying train variant.</span><br /> +<br /> +<a href='./random-weird-things-iv/sl-train.gif'><img alt='SL train in action' title='SL train in action' src='./random-weird-things-iv/sl-train.gif' /></a><br /> +<a class='textlink' href='https://github.com/mtoyoda/sl'>sl</a><br /> +<br /> +<h2 style='display: inline' id='40-url-in-c-code-puzzle'>40. URL in C Code Puzzle</h2><br /> +<br /> +<span>The following C program compiles and runs perfectly:</span><br /> +<br /> +<pre> +#include <stdio.h> + +int main(void) { + https://foo.zone + printf("hello, world\n"); + return 0; +} +</pre> +<br /> +<span>The <span class='inlinecode'>https:</span> becomes a label, the <span class='inlinecode'>//foo.zone</span> is just a comment. C parser shenanigans.</span><br /> +<br /> +<span>Found something weird lately? Send me a link!</span><br /> +<br /> +<span>E-Mail your comments to <span class='inlinecode'>paul@nospam.buetow.org</span> :-)</span><br /> +<br /> +<a class='textlink' href='../'>Back to the main site</a><br /> + </div> + </content> + </entry> + <entry> <title>`gt` calculator - a calculator built with local LLMs</title> <link href="https://foo.zone/gemfeed/2026-06-01-gt-calculator.html" /> <id>https://foo.zone/gemfeed/2026-06-01-gt-calculator.html</id> @@ -11362,6 +11562,7 @@ ls -d -- !(.git|node_modules) <font color="#000000">2</font>>/dev/null <a class='textlink' href='./2024-07-05-random-weird-things.html'>2024-07-05 Random Weird Things - Part Ⅰ</a><br /> <a class='textlink' href='./2025-02-08-random-weird-things-ii.html'>2025-02-08 Random Weird Things - Part Ⅱ</a><br /> <a class='textlink' href='./2025-08-15-random-weird-things-iii.html'>2025-08-15 Random Weird Things - Part Ⅲ (You are currently reading this)</a><br /> +<a class='textlink' href='./2026-06-06-random-weird-things-iv.html'>2026-06-06 Random Weird Things - Part Ⅳ</a><br /> <br /> <pre> /\_/\ /\_/\ /\_/\ @@ -18490,6 +18691,7 @@ http://www.gnu.org/software/src-highlite --> <a class='textlink' href='./2024-07-05-random-weird-things.html'>2024-07-05 Random Weird Things - Part Ⅰ</a><br /> <a class='textlink' href='./2025-02-08-random-weird-things-ii.html'>2025-02-08 Random Weird Things - Part Ⅱ (You are currently reading this)</a><br /> <a class='textlink' href='./2025-08-15-random-weird-things-iii.html'>2025-08-15 Random Weird Things - Part Ⅲ</a><br /> +<a class='textlink' href='./2026-06-06-random-weird-things-iv.html'>2026-06-06 Random Weird Things - Part Ⅳ</a><br /> <br /> <pre> /\_/\ /\_/\ @@ -20323,209 +20525,4 @@ Waking up e8:ff:1e:d7:1c:a0... </div> </content> </entry> - <entry> - <title>f3s: Kubernetes with FreeBSD - Part 1: Setting the stage</title> - <link href="https://foo.zone/gemfeed/2024-11-17-f3s-kubernetes-with-freebsd-part-1.html" /> - <id>https://foo.zone/gemfeed/2024-11-17-f3s-kubernetes-with-freebsd-part-1.html</id> - <updated>2024-11-16T23:20:14+02:00</updated> - <author> - <name>Paul Buetow aka snonux</name> - <email>paul@dev.buetow.org</email> - </author> - <summary>This is the first blog post about my f3s series for my self-hosting demands in my home lab. f3s? The 'f' stands for FreeBSD, and the '3s' stands for k3s, the Kubernetes distribution I will use on FreeBSD-based physical machines.</summary> - <content type="xhtml"> - <div xmlns="http://www.w3.org/1999/xhtml"> - <h1 style='display: inline' id='f3s-kubernetes-with-freebsd---part-1-setting-the-stage'>f3s: Kubernetes with FreeBSD - Part 1: Setting the stage</h1><br /> -<br /> -<span class='quote'>Published at 2024-11-16T23:20:14+02:00</span><br /> -<br /> -<span>This is the first blog post about my f3s series for my self-hosting demands in my home lab. f3s? The "f" stands for FreeBSD, and the "3s" stands for k3s, the Kubernetes distribution I will use on FreeBSD-based physical machines.</span><br /> -<br /> -<span>I will post a new entry every month or so (there are too many other side projects for more frequent updates—I bet you can understand).</span><br /> -<br /> -<span>These are all the posts so far:</span><br /> -<br /> -<a class='textlink' href='./2024-11-17-f3s-kubernetes-with-freebsd-part-1.html'>2024-11-17 f3s: Kubernetes with FreeBSD - Part 1: Setting the stage (You are currently reading this)</a><br /> -<a class='textlink' href='./2024-12-03-f3s-kubernetes-with-freebsd-part-2.html'>2024-12-03 f3s: Kubernetes with FreeBSD - Part 2: Hardware and base installation</a><br /> -<a class='textlink' href='./2025-02-01-f3s-kubernetes-with-freebsd-part-3.html'>2025-02-01 f3s: Kubernetes with FreeBSD - Part 3: Protecting from power cuts</a><br /> -<a class='textlink' href='./2025-04-05-f3s-kubernetes-with-freebsd-part-4.html'>2025-04-05 f3s: Kubernetes with FreeBSD - Part 4: Rocky Linux Bhyve VMs</a><br /> -<a class='textlink' href='./2025-05-11-f3s-kubernetes-with-freebsd-part-5.html'>2025-05-11 f3s: Kubernetes with FreeBSD - Part 5: WireGuard mesh network</a><br /> -<a class='textlink' href='./2025-07-14-f3s-kubernetes-with-freebsd-part-6.html'>2025-07-14 f3s: Kubernetes with FreeBSD - Part 6: Storage</a><br /> -<a class='textlink' href='./2025-10-02-f3s-kubernetes-with-freebsd-part-7.html'>2025-10-02 f3s: Kubernetes with FreeBSD - Part 7: k3s and first pod deployments</a><br /> -<a class='textlink' href='./2025-12-07-f3s-kubernetes-with-freebsd-part-8.html'>2025-12-07 f3s: Kubernetes with FreeBSD - Part 8: Observability</a><br /> -<a class='textlink' href='./2025-12-14-f3s-kubernetes-with-freebsd-part-8b.html'>2025-12-14 f3s: Kubernetes with FreeBSD - Part 8b: Distributed Tracing with Tempo</a><br /> -<a class='textlink' href='./2026-04-02-f3s-kubernetes-with-freebsd-part-9.html'>2026-04-02 f3s: Kubernetes with FreeBSD - Part 9: GitOps with ArgoCD</a><br /> -<br /> -<a href='./f3s-kubernetes-with-freebsd-part-1/f3slogo.png'><img alt='f3s logo' title='f3s logo' src='./f3s-kubernetes-with-freebsd-part-1/f3slogo.png' /></a><br /> -<br /> -<span class='quote'>ChatGPT generated logo..</span><br /> -<br /> -<span>Let's begin...</span><br /> -<br /> -<h2 style='display: inline' id='table-of-contents'>Table of Contents</h2><br /> -<br /> -<ul> -<li><a href='#f3s-kubernetes-with-freebsd---part-1-setting-the-stage'>f3s: Kubernetes with FreeBSD - Part 1: Setting the stage</a></li> -<li>⇢ <a href='#why-this-setup'>Why this setup?</a></li> -<li>⇢ <a href='#the-infrastructure'>The infrastructure</a></li> -<li>⇢ ⇢ <a href='#physical-freebsd-nodes-and-linux-vms'>Physical FreeBSD nodes and Linux VMs</a></li> -<li>⇢ ⇢ <a href='#kubernetes-with-k3s-'>Kubernetes with k3s </a></li> -<li>⇢ ⇢ <a href='#ha-volumes-for-k3s-with-hastzfs-and-nfs'>HA volumes for k3s with HAST/ZFS and NFS</a></li> -<li>⇢ ⇢ <a href='#openbsdrelayd-to-the-rescue-for-external-connectivity'>OpenBSD/<span class='inlinecode'>relayd</span> to the rescue for external connectivity</a></li> -<li>⇢ <a href='#data-integrity'>Data integrity</a></li> -<li>⇢ ⇢ <a href='#periodic-backups'>Periodic backups</a></li> -<li>⇢ ⇢ <a href='#power-protection'>Power protection</a></li> -<li>⇢ <a href='#monitoring-keeping-an-eye-on-everything'>Monitoring: Keeping an eye on everything</a></li> -<li>⇢ ⇢ <a href='#prometheus-and-grafana'>Prometheus and Grafana</a></li> -<li>⇢ ⇢ <a href='#gogios-my-custom-alerting-system'>Gogios: My custom alerting system</a></li> -<li>⇢ <a href='#conclusion'>Conclusion</a></li> -</ul><br /> -<h2 style='display: inline' id='why-this-setup'>Why this setup?</h2><br /> -<br /> -<span>My previous setup was great for learning Terraform and AWS, but it is too expensive. Costs are under control there, but only because I am shutting down all containers after use (so they are offline ninety percent of the time and still cost around $20 monthly). With the new setup, I could run all containers 24/7 at home, which would still be cheaper in terms of electricity consumption. I have a 400 MBit/s uplink (I could have more if I wanted, but it is more than plenty for my use case already).</span><br /> -<br /> -<a class='textlink' href='./2024-02-04-from-babylon5.buetow.org-to-.cloud.html'>From <span class='inlinecode'>babylon5.buetow.org</span> to <span class='inlinecode'>.cloud</span></a><br /> -<br /> -<span>Migrating off all my containers from AWS ECS means I need a reliable and scalable environment to host my workloads. I wanted something:</span><br /> -<br /> -<ul> -<li>To self-host all my open-source apps (Docker containers).</li> -<li>Fully under my control (goodbye cloud vendor lock-in).</li> -<li>Secure and redundant.</li> -<li>Cost-efficient (after the initial hardware investment).</li> -<li>Something I can poke around with and also pick up new skills.</li> -</ul><br /> -<h2 style='display: inline' id='the-infrastructure'>The infrastructure</h2><br /> -<br /> -<span>This is still in progress, and I need to own the hardware. But in this first part of the blog series, I will outline what I intend to do.</span><br /> -<br /> -<a href='./f3s-kubernetes-with-freebsd-part-1/diagram.png'><img alt='Diagram' title='Diagram' src='./f3s-kubernetes-with-freebsd-part-1/diagram.png' /></a><br /> -<br /> -<h3 style='display: inline' id='physical-freebsd-nodes-and-linux-vms'>Physical FreeBSD nodes and Linux VMs</h3><br /> -<br /> -<span>The setup starts with three physical FreeBSD nodes deployed into my home LAN. On these, I'm going to run Rocky Linux virtual machines with bhyve. Why Linux VMs in FreeBSD and not Linux directly? I want to leverage the great ZFS integration in FreeBSD (among other features), and I have been using FreeBSD for a while in my home lab. And with bhyve, there is a very performant hypervisor available which makes the Linux VMs de-facto run at native speed (another use case of mine would be maybe running a Windows bhyve VM on one of the nodes - but out of scope for this blog series).</span><br /> -<br /> -<a class='textlink' href='https://www.freebsd.org/'>https://www.freebsd.org/</a><br /> -<a class='textlink' href='https://wiki.freebsd.org/bhyve'>https://wiki.freebsd.org/bhyve</a><br /> -<br /> -<span>I selected Rocky Linux because it comes with long-term support (I don't want to upgrade the VMs every 6 months). Rocky Linux 9 will reach its end of life in 2032, which is plenty of time! Of course, there will be minor upgrades, but nothing will significantly break my setup.</span><br /> -<br /> -<a class='textlink' href='https://rockylinux.org/'>https://rockylinux.org/</a><br /> -<a class='textlink' href='https://wiki.rockylinux.org/rocky/version/'>https://wiki.rockylinux.org/rocky/version/</a><br /> -<br /> -<span>Furthermore, I am already using "RHEL-family" related distros at work and Fedora on my main personal laptop. Rocky Linux belongs to the same type of Linux distribution family, so I already feel at home here. I also used Rocky 9 before I switched to AWS ECS. Now, I am switching back in one sense or another ;-)</span><br /> -<br /> -<h3 style='display: inline' id='kubernetes-with-k3s-'>Kubernetes with k3s </h3><br /> -<br /> -<span>These Linux VMs form a three-node k3s Kubernetes cluster, where my containers will reside moving forward. The 3-node k3s cluster will be highly available (in <span class='inlinecode'>etcd</span> mode), and all apps will probably be deployed with Helm. Prometheus will also be running in k3s, collecting time-series metrics and handling monitoring. Additionally, a private Docker registry will be deployed into the k3s cluster, where I will store some of my self-created Docker images. k3s is the perfect distribution of Kubernetes for homelabbers due to its simplicity and the inclusion of the most useful features out of the box!</span><br /> -<br /> -<a class='textlink' href='https://k3s.io/'>https://k3s.io/</a><br /> -<br /> -<h3 style='display: inline' id='ha-volumes-for-k3s-with-hastzfs-and-nfs'>HA volumes for k3s with HAST/ZFS and NFS</h3><br /> -<br /> -<span>Persistent storage for the k3s cluster will be handled by highly available (HA) NFS shares backed by ZFS on the FreeBSD hosts. </span><br /> -<br /> -<span>On two of the three physical FreeBSD nodes, I will add a second SSD drive to each and dedicate it to a <span class='inlinecode'>zhast</span> ZFS pool. With HAST (FreeBSD's solution for highly available storage), this <span class='inlinecode'>pool</span> will be replicated at the byte level to a standby node.</span><br /> -<br /> -<span>A virtual IP (VIP) will point to the master node. When the master node goes down, the VIP will failover to the standby node, where the ZFS pool will be mounted. An NFS server will listen to both nodes. k3s will use the VIP to access the NFS shares.</span><br /> -<br /> -<a class='textlink' href='https://wiki.freebsd.org/HighlyAvailableStorage'>FreeBSD Wiki: Highly Available Storage</a><br /> -<br /> -<span>You can think of DRBD being the Linux equivalent to FreeBSD's HAST.</span><br /> -<br /> -<h3 style='display: inline' id='openbsdrelayd-to-the-rescue-for-external-connectivity'>OpenBSD/<span class='inlinecode'>relayd</span> to the rescue for external connectivity</h3><br /> -<br /> -<span>All apps should be reachable through the internet (e.g., from my phone or computer when travelling). For external connectivity and TLS management, I've got two OpenBSD VMs (one hosted by OpenBSD Amsterdam and another hosted by Hetzner) handling public-facing services like DNS, relaying traffic, and automating Let's Encrypt certificates. </span><br /> -<br /> -<span>All of this (every Linux VM to every OpenBSD box) will be connected via WireGuard tunnels, keeping everything private and secure. There will be 6 WireGuard tunnels (3 k3s nodes times two OpenBSD VMs).</span><br /> -<br /> -<a class='textlink' href='https://en.wikipedia.org/wiki/WireGuard'>https://en.wikipedia.org/wiki/WireGuard</a><br /> -<br /> -<span>So, when I want to access a service running in k3s, I will hit an external DNS endpoint (with the authoritative DNS servers being the OpenBSD boxes). The DNS will resolve to the master OpenBSD VM (see my KISS highly-available with OpenBSD blog post), and from there, the <span class='inlinecode'>relayd</span> process (with a Let's Encrypt certificate—see my Let's Encrypt with OpenBSD and Rex blog post) will accept the TCP connection and forward it through the WireGuard tunnel to a reachable node port of one of the k3s nodes, thus serving the traffic.</span><br /> -<br /> -<a class='textlink' href='./2024-04-01-KISS-high-availability-with-OpenBSD.html'>KISS high-availability with OpenBSD</a><br /> -<a class='textlink' href='./2022-07-30-lets-encrypt-with-openbsd-and-rex.html'>Let's Encrypt with OpenBSD and Rex</a><br /> -<br /> -<span>The OpenBSD setup described here already exists and is ready to use. The only thing that does not yet exist is the configuration of <span class='inlinecode'>relayd</span> to forward requests to k3s through the WireGuard tunnel(s).</span><br /> -<br /> -<h2 style='display: |
