<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator>
  <link href="http://flower.codes/feed.xml" rel="self" type="application/atom+xml" />
  <link href="http://flower.codes/" rel="alternate" type="text/html" />
  <updated>2026-03-29T18:59:47+00:00</updated>
  <id>http://flower.codes/feed.xml</id>
  <title type="html">flower.codes</title>
  <subtitle>Impostor.</subtitle>
  <author>
    <name>Zachary Flower</name>
  </author>
  <entry>
    <title type="html">CodeReader</title>
    <link href="http://flower.codes/2026/02/24/codereader.html" rel="alternate" type="text/html" title="CodeReader" />
    <published>2026-02-24T15:03:00+00:00</published>
    <updated>2026-02-24T15:03:00+00:00</updated>
    <id>http://flower.codes/2026/02/24/codereader</id><content type="html" xml:base="http://flower.codes/2026/02/24/codereader.html">&lt;p&gt;Sometimes you just want to read without HR getting all judgy and putting you on a &amp;quot;performance improvement plan,&amp;quot; so I recently decided to make a &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=zachflower.codereader&quot;&gt;Visual Studio Code extension&lt;/a&gt; that renders eBooks as code in (18?) languages.&lt;/p&gt;
&lt;p&gt;Dubbed &amp;quot;CodeReader,&amp;quot; this extension takes any EPUB file (hopefully, I haven&apos;t tested &lt;i&gt;all&lt;/i&gt; the EPUBs) and renders it in valid-looking code, allowing you to discretely read your books in peace.&lt;/p&gt;
&lt;p&gt;The current version supports highlighting, place memory, and 18ish languages so your book is compatible with every tech stack you use (and probably a bunch of stacks you don&apos;t). While the supported languages range from Bash to Visual Basic, here are some examples of what your book might look like in a few of them:&lt;/p&gt;
&lt;h3 id=&quot;clojure&quot;&gt;Clojure&lt;/h3&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#f6aa11&quot;&gt;comment&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
  &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;Younger&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;then,&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;she&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;convinced&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;her&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;father&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;to&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;give&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;Nero&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;the&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;throne&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;of&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;Mars&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#f6aa11&quot;&gt;and&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;his&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;revenge&lt;/font&gt;&lt;font color=&quot;#75715e&quot;&gt;; in return, she earned Nero’s support when she led the faction that overthrew and killed her father five years later.&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
  &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;segment&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;”&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
  &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;buffer&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;“I didn’t know this,” I say quietly.&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
  &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;content&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;“History is written by the victors.”&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
  &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;data&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;Lorn looks at me and the lines on his face seem to deepen. “I don’t want to go to war, Darrow.&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
  &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;segment&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;In my time, I have seen a moon burn, because one man would not bow. I have led a million warriors shot from warships to invade a planet.&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
  &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#a6e22e&quot;&gt;read-passage&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;You cannot begin to understand the horror of it. You think only of how beautiful it will be. But they are men. They are women. They have families.&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
  &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;content&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;And they die by the thousands. ”&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#f6aa11&quot;&gt;comment&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
  &lt;/font&gt;&lt;font color=&quot;#960050&quot;&gt;“&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;Ah!&lt;/font&gt;&lt;font color=&quot;#960050&quot;&gt;”&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;He&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;points&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;uphill.&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#960050&quot;&gt;“&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;There&lt;/font&gt;&lt;font color=&quot;#960050&quot;&gt;’&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;s&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;Icarus.&lt;/font&gt;&lt;font color=&quot;#960050&quot;&gt;”&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#f6aa11&quot;&gt;comment&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
  &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;Rain&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;drips&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;from&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;the&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;pines&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;as&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;we&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;push&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;through&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;the&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;lower&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;tree&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;boughs&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;to&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#f6aa11&quot;&gt;find&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;Icarus,&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;Lorn&lt;/font&gt;&lt;font color=&quot;#960050&quot;&gt;’&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;s&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;pet&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;griffin,&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;sleeping&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;in&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;great&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;bed&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;of&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;moss&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;on&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;a&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;high&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;promontory&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;inside&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;the&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;small&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;forest.&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
&lt;/font&gt;&lt;font color=&quot;#75715e&quot;&gt;; Icarus’s paws curl into his body. His wings curve around him as he sleeps—iridescent and glittering with droplets of water.&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
&lt;/font&gt;&lt;/pre&gt;&lt;/font&gt;
&lt;h3 id=&quot;javascript&quot;&gt;JavaScript&lt;/h3&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#ffffff&quot;&gt;console&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#a6e22e&quot;&gt;log&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;I ALMOST ATTEMPT A WILD, ill-advised leap back up toward the hallway before I realise my descent is smooth. Controlled, not falling.&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#75715e&quot;&gt;/*
  * I’ve seen Will-imbued transportation platforms move this way, though I’ve never been on one.
  */&lt;/font&gt;
&lt;font color=&quot;#ffffff&quot;&gt;console&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#a6e22e&quot;&gt;log&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;I cling to the crimson railing, breaths still ragged and flustered; as my skin makes contact, the glass-like surface glows, bringing a startling respite from the utter darkness.&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#f92672&quot;&gt;this&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#a6e22e&quot;&gt;_readPassage&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;The light is tinted the same colour, though. Casts everything in a dark red. Preferable to the terrifying unknown, but not by much.&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#75715e&quot;&gt;// I recover enough to take stock. The hallway above has already disappeared, and the wall behind me is smooth. Unclimbable.&lt;/font&gt;
&lt;font color=&quot;#75715e&quot;&gt;/*
  * It seems I’m going wherever this is taking me.
  */&lt;/font&gt;
&lt;font color=&quot;#75715e&quot;&gt;/*
  * I reluctantly stop craning my neck.
  */&lt;/font&gt;
&lt;font color=&quot;#ffffff&quot;&gt;console&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#a6e22e&quot;&gt;log&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;My knuckles are white against the blushing of the balustrade as the wall behind me is suddenly gone, replaced by inky darkness above and below and around on all sides, as if I’m sinking into an unending abyss.&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#66d9ef&quot;&gt;const&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;_content&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;The stone platform’s descent continues for anxious minutes.&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;;&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;h3 id=&quot;php&quot;&gt;PHP&lt;/h3&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#75715e&quot;&gt;// Golden Son&lt;/font&gt;
&lt;font color=&quot;#f92672&quot;&gt;echo&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;14&lt;/font&gt;&lt;font color=&quot;#ae81ff&quot;&gt;\n&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;;&lt;/font&gt;
&lt;font color=&quot;#ffffff&quot;&gt;$this&lt;/font&gt;&lt;font color=&quot;#f92672&quot;&gt;-&amp;gt;&lt;/font&gt;&lt;font color=&quot;#a6e22e&quot;&gt;processText&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;The Sovereign&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#75715e&quot;&gt;// “Once upon a time, there was a family of strong wills,” she says, voice slow and measured as a pendulum. “They did not love one another.&lt;/font&gt;
&lt;font color=&quot;#ffffff&quot;&gt;$buffer&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;But together they presided over a farm. And on that farm, there were hounds, and bitches, and dairy cows, and hens, and cocks, and sheep, and mules, and horses.&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;;&lt;/font&gt;
&lt;font color=&quot;#75715e&quot;&gt;/*
  * The family kept the beasts in line. And the beasts kept them rich, fat, and happy.
  */&lt;/font&gt;
&lt;font color=&quot;#75715e&quot;&gt;// Now, the beasts obeyed because they knew the family was strong, and to disobey was to suffer their united wrath. ’”&lt;/font&gt;
&lt;font color=&quot;#75715e&quot;&gt;// Her eyes burn into mine. Neither of us look away. Silence in the sparse suite, except the sound of rain at the windows of her skyscraper.&lt;/font&gt;
&lt;font color=&quot;#ffffff&quot;&gt;$this&lt;/font&gt;&lt;font color=&quot;#f92672&quot;&gt;-&amp;gt;&lt;/font&gt;&lt;font color=&quot;#a6e22e&quot;&gt;readPassage&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;We’re amongst the clouds. Ships pass in the haze outside like silent, glowing sharks.&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#f92672&quot;&gt;echo&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;The leather creaks as she leans forward and steeples her long fingers, which are painted red, a lone splash of color.&lt;/font&gt;&lt;font color=&quot;#ae81ff&quot;&gt;\n&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;;&lt;/font&gt;
&lt;font color=&quot;#75715e&quot;&gt;// Then her lips curl in condescension, accenting each syllable as though I were an Agea street child only just learning her language.&lt;/font&gt;
&lt;font color=&quot;#ffffff&quot;&gt;$segment&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;“You remind me of my father.”&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;;&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;h3 id=&quot;ruby&quot;&gt;Ruby&lt;/h3&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#75715e&quot;&gt;=begin
  “They say you can hear the dead stormsons whooping in the wind,” he mutters. ”
=end&lt;/font&gt;
  &lt;font color=&quot;#f6aa11&quot;&gt;puts&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;“Storms of court have a way of drawing people back in,” I say.&quot;&lt;/font&gt;
  &lt;font color=&quot;#ffffff&quot;&gt;read_passage&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;He laughs a derisive laugh, one that scorns the idea that I would know anything about the storms of court, anything about the winds that blow.&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;
  &lt;font color=&quot;#ffffff&quot;&gt;content&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;I came to him in secret, flying with a single ship, my five-kilometer destroyer Pax. I told my master he would not help us.&quot;&lt;/font&gt;
  &lt;font color=&quot;#ffffff&quot;&gt;process_text&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;But I held on to hope he would want to help me. Yet now that I see Lorn au Arcos again in the knotted flesh, I’m reminded of the nature of the man and I worry.&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;
  &lt;font color=&quot;#f6aa11&quot;&gt;puts&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;He knows my captains and lieutenants are listening through the com unit in my ear.&quot;&lt;/font&gt;
  &lt;font color=&quot;#f6aa11&quot;&gt;puts&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;I paid him respects and showed it to him so that he would not assume our conversation to be a private one.&quot;&lt;/font&gt;
  &lt;font color=&quot;#ffffff&quot;&gt;content&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;” One would think him to be in his mid-sixties, at first glance. Only his scars truly age him.&quot;&lt;/font&gt;
  &lt;font color=&quot;#ffffff&quot;&gt;process_text&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;The one on his neck, like a smile, was given to him four decades ago by a Stained in the Moon Kings’ Rebellion, when the Governors of Jupiter’s moons thought to make their own kingdoms after Octavia deposed her father as Sovereign.&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;
&lt;font color=&quot;#75715e&quot;&gt;=begin
  The one that claims part of his nose came from the Ash Lord, when they dueled as youths. ”
=end&lt;/font&gt;
  &lt;font color=&quot;#ffffff&quot;&gt;read_passage&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;“I have said it myself.”&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;
  &lt;font color=&quot;#f6aa11&quot;&gt;puts&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;He grunts. “I have lived it. I have lost many for my own glory. I have set my ship into the storm on purpose. ” He lets the waves speak for a moment.&quot;&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;If you like this post or one of my projects, you can &lt;a href=&quot;https://www.buymeacoffee.com/zachflower&quot;&gt;buy me a coffee&lt;/a&gt;, or &lt;a href=&quot;mailto:zach@flower.codes&quot;&gt;send me a note&lt;/a&gt;. I&apos;d love to hear from you!&lt;/a&gt;</content>
    <author>
      <name>Zachary Flower</name>
    </author>
    <summary type="html">Sometimes you just want to read without HR getting all judgy and putting you on a &amp;quot;performance improvement plan,&amp;quot; so I recently decided to make a Visual Studio Code extension that renders eBooks as code in (18?) languages.</summary>
  </entry>
  <entry>
    <title type="html">Eval++</title>
    <link href="http://flower.codes/2026/02/18/eval-plus-plus.html" rel="alternate" type="text/html" title="Eval++" />
    <published>2026-02-18T17:10:00+00:00</published>
    <updated>2026-02-18T17:10:00+00:00</updated>
    <id>http://flower.codes/2026/02/18/eval-plus-plus</id><content type="html" xml:base="http://flower.codes/2026/02/18/eval-plus-plus.html">&lt;p&gt;Dear friends, I present to you the next generation in software development: eval++!&lt;/p&gt;
&lt;p&gt;Inspired by GitHub&apos;s recent release of their &lt;a href=&quot;https://github.blog/news-insights/company-news/build-an-agent-into-any-app-with-the-github-copilot-sdk/&quot;&gt;Copilot SDK&lt;/a&gt;, I decided to take a stab at one of the most controversial functions of all time and make it better, using the power of AI.&lt;/p&gt;
&lt;p&gt;Eval++ is an LLM-powered replacement of JavaScript&apos;s &lt;code&gt;eval()&lt;/code&gt; function that can probably handle any code or code-like text you throw at it, marking our ascension from the purgatory that is deterministic software development to a new enlightenment of &lt;b&gt;&amp;quot;anything codes, anything goes.&amp;quot;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;So far, eval++ supports only JavaScript, but Python, PHP, and Ruby are all on the evolutionary roadmap.&lt;/p&gt;
&lt;p&gt;Here&apos;s how it works:&lt;/p&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f92672&quot;&gt;import&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;evil&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;from&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&apos;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;@zachflower/eval-plus-plus&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&apos;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;;&lt;/font&gt;

&lt;font color=&quot;#75715e&quot;&gt;// Evaluate code&lt;/font&gt;
&lt;font color=&quot;#66d9ef&quot;&gt;const&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;result&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;await&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;evil&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&apos;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;2 + 2&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&apos;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;);&lt;/font&gt;
&lt;font color=&quot;#ffffff&quot;&gt;console&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#a6e22e&quot;&gt;log&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;result&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;);&lt;/font&gt; &lt;font color=&quot;#75715e&quot;&gt;// &quot;4&quot;&lt;/font&gt;

&lt;font color=&quot;#75715e&quot;&gt;// Analyze complex code&lt;/font&gt;
&lt;font color=&quot;#66d9ef&quot;&gt;const&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;analysis&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;await&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;evil&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;`
  function fibonacci(n) {
    if (n &amp;lt;= 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
  }
  fibonacci(10)
`&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;);&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;The result of the above will be &lt;i&gt;exactly&lt;/i&gt; what you expect: the number &lt;code&gt;55&lt;/code&gt;. Hell, it doesn&apos;t even have to be valid JavaScript code! You can throw in some Python or Ruby and it will still give you a result, because eval++ is powered by an LLM that can understand multiple programming languages.&lt;/p&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#66d9ef&quot;&gt;const&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;result&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;await&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;evil&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;`
  def fibonacci(n):
    if n &amp;lt;= 1:
        return n
      return fibonacci(n - 1) + fibonacci(n - 2)
  fibonacci(10)
`&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;);&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;Same result, different language! But what makes eval++ truly revolutionary is that it can also handle code that isn&apos;t even code! For example:&lt;/p&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#66d9ef&quot;&gt;const&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;result&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;await&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;evil&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&apos;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;What is the meaning of life, the universe, and everything?&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&apos;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;);&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;The result of this will probably be &lt;code&gt;42&lt;/code&gt;, but it might be something entirely different, depending on the whims of the AI. The point is that with eval++, you can throw anything at it and it will give you &lt;i&gt;something&lt;/i&gt; back, whether it&apos;s a valid JavaScript expression or a philosophical question.&lt;/p&gt;
&lt;p&gt;So, if you are interested in trying out eval++, you can learn more about it and get the code on GitHub here: &lt;a href=&quot;https://zachflower.github.io/eval-plus-plus/&quot;&gt;Eval++ Website&lt;/a&gt; and &lt;a href=&quot;https://github.com/zachflower/eval-plus-plus&quot;&gt;Eval++ GitHub Repository&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;If you like this post or one of my projects, you can &lt;a href=&quot;https://www.buymeacoffee.com/zachflower&quot;&gt;buy me a coffee&lt;/a&gt;, or &lt;a href=&quot;mailto:zach@flower.codes&quot;&gt;send me a note&lt;/a&gt;. I&apos;d love to hear from you!&lt;/a&gt;</content>
    <author>
      <name>Zachary Flower</name>
    </author>
    <category term="ai" />
    <category term="development" />
    <category term="satire" />
    <summary type="html">Dear friends, I present to you the next generation in software development: eval++!</summary>
  </entry>
  <entry>
    <title type="html">Blocking IP Addresses with Caddy</title>
    <link href="http://flower.codes/2026/02/17/fice.html" rel="alternate" type="text/html" title="Blocking IP Addresses with Caddy" />
    <published>2026-02-17T16:30:00+00:00</published>
    <updated>2026-02-17T16:30:00+00:00</updated>
    <id>http://flower.codes/2026/02/17/fice</id><content type="html" xml:base="http://flower.codes/2026/02/17/fice.html">&lt;p&gt;&lt;em&gt;Shhhhhh! This post is for RSS subscribers only. &lt;a href=&quot;https://daverupert.com/2018/01/welcome-to-rss-club/&quot;&gt;Look here&lt;/a&gt; for more information (and to join in on the fun).&lt;/em&gt;&lt;/p&gt;

    &lt;p&gt;--&lt;/p&gt;&lt;p&gt;Did you know that there&apos;s a &lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_assigned_/8_IPv4_address_blocks&quot;&gt;Wikipedia page&lt;/a&gt; that lists all of the assigned &lt;code&gt;/8&lt;/code&gt; IPV4 address blocks?&lt;/p&gt;
&lt;p&gt;A person, if they were so inclined, could take this list (or &lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_assigned_/8_IPv4_address_blocks#List_of_/8_blocks_assigned_to_the_United_States_Department_of_Defense&quot;&gt;a subset of it&lt;/a&gt;) and block all of those IP addresses from accessing their website using Caddy&apos;s &lt;code&gt;remote_ip&lt;/code&gt; matcher (or whatever the equivalent is in your web server of choice).&lt;/p&gt;
&lt;p&gt;As an example, let&apos;s say that we want to block all of the IP addresses that are assigned to the United States Department of Defense for &lt;a href=&quot;https://apnews.com/article/immigration-enforcement-minnesota-4d1499fc5962ab880f3816259e04bdbf&quot;&gt;no&lt;/a&gt; &lt;a href=&quot;https://apnews.com/article/minnesota-immigration-enforcement-shooting-crackdown-surge-173e00fa7388054e98c3b5b9417c1e5a&quot;&gt;particular&lt;/a&gt; &lt;a href=&quot;https://apnews.com/article/immigration-minnesota-boy-father-detained-342f319fafb766d13afe07f5bcc1f112&quot;&gt;reason&lt;/a&gt; whatsoever.&lt;/p&gt;
&lt;p&gt;To do that, we can add the following lines to our Caddyfile:&lt;/p&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;@blocked_ips {
    remote_ip 6.0.0.0/8 7.0.0.0/8 11.0.0.0/8 21.0.0.0/8 22.0.0.0/8 26.0.0.0/8 28.0.0.0/8 29.0.0.0/8 30.0.0.0/8 33.0.0.0/8 55.0.0.0/8 214.0.0.0/8 215.0.0.0/8
}

handle @blocked_ips {
    respond 403
}
&lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;If we want to be really cheeky (as the cartoon dogs my kids are obsessed with like to say), we could even redirect them to another website:&lt;/p&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;handle @blocked_ips {
    redir https://www.archives.gov/founding-docs/constitution-transcript 302
}
&lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;Before I get emails about how pointless this probably is, I already know.&lt;/p&gt;
&lt;p&gt;It won&apos;t prevent someone from accessing your site—or cause anyone to &lt;i&gt;care&lt;/i&gt; about your site—if they use a VPN or Tor or their home network or their smartphone, but for a few lines of config, it&apos;s nothing if not a statement that I&apos;d argue is worth making these days.&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;If you like this post or one of my projects, you can &lt;a href=&quot;https://www.buymeacoffee.com/zachflower&quot;&gt;buy me a coffee&lt;/a&gt;, or &lt;a href=&quot;mailto:zach@flower.codes&quot;&gt;send me a note&lt;/a&gt;. I&apos;d love to hear from you!&lt;/a&gt;</content>
    <author>
      <name>Zachary Flower</name>
    </author>
    <category term="privacy" />
    <category term="security" />
    <category term="surveillance" />
    <summary type="html">Did you know that there&apos;s a Wikipedia page that lists all of the assigned /8 IPV4 address blocks?</summary>
  </entry>
  <entry>
    <title type="html">Go Read a Book</title>
    <link href="http://flower.codes/2026/01/24/go-read-a-book.html" rel="alternate" type="text/html" title="Go Read a Book" />
    <published>2026-01-24T23:41:00+00:00</published>
    <updated>2026-01-24T23:41:00+00:00</updated>
    <id>http://flower.codes/2026/01/24/go-read-a-book</id><content type="html" xml:base="http://flower.codes/2026/01/24/go-read-a-book.html">&lt;p&gt;There&apos;s a lot of shitty news happening lately, and I&apos;ve been having trouble holding space for it all.&lt;/p&gt;
&lt;p&gt;I&apos;ve noticed that my 2020-doomscrolling habit has started to ramp back up, so I built a Google Chrome extension (with a little help from Gemini) that automatically redirects my browser to a Kindle book in my library whenever I try to go to a site that I think is hurting my mental health:&lt;/p&gt;
&lt;p&gt;&lt;center class=&quot;i&quot;&gt;&lt;img src=&quot;/assets/img/posts/go-read-a-book.png&quot; alt=&quot;Go Read a Book Screenshot&quot; height=&quot;475&quot; width=&quot;760&quot; loading=&quot;lazy&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;It&apos;s been a nice, gentle reminder that following the news is one thing, but drowning myself in it is another thing entirely. Instead of drinking from the firehose of badness, I can stay up to date with a few select, timely sources, and then redirect myself to something more productive when I try to get another hit, like reading a relevant history book to better understand the current cultural and political moment.&lt;/p&gt;
&lt;p&gt;This is a thing I built for me, but I thought I&apos;d share in case anyone else is in the same boat. I&apos;ve added no analytics, no data collection, no monetization, no account creation, or anything else.&lt;/p&gt;
&lt;p&gt;Just a simple, single-purpose browser extension.&lt;/p&gt;
&lt;p&gt;You can find it on the Chrome Web Store here if you&apos;re interested: &lt;a href=&quot;https://chromewebstore.google.com/detail/go-read-a-book/ecafldaielmlpopapfgmephmjkkphlmi&quot;&gt;Go Read a Book - Chrome Web Store&lt;/a&gt;&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;If you like this post or one of my projects, you can &lt;a href=&quot;https://www.buymeacoffee.com/zachflower&quot;&gt;buy me a coffee&lt;/a&gt;, or &lt;a href=&quot;mailto:zach@flower.codes&quot;&gt;send me a note&lt;/a&gt;. I&apos;d love to hear from you!&lt;/a&gt;</content>
    <author>
      <name>Zachary Flower</name>
    </author>
    <category term="ai" />
    <category term="development" />
    <category term="reading" />
    <summary type="html">There&apos;s a lot of shitty news happening lately, and I&apos;ve been having trouble holding space for it all.</summary>
  </entry>
  <entry>
    <title type="html">Vibe Mapping</title>
    <link href="http://flower.codes/2026/01/15/antigravity.html" rel="alternate" type="text/html" title="Vibe Mapping" />
    <published>2026-01-15T16:39:20+00:00</published>
    <updated>2026-01-15T16:39:20+00:00</updated>
    <id>http://flower.codes/2026/01/15/antigravity</id><content type="html" xml:base="http://flower.codes/2026/01/15/antigravity.html">&lt;p&gt;Some of you know this, but I got into computing after being exposed to MUDs in the late 90&apos;s. For the uninitiated, MUDs were the text-based precursors to MMORPGs like Everquest and World of Warcraft—in fact, Everquest was even sued by one of the progenitors of the entire genre because the game, while graphical, had elements that were so eerily similar.&lt;/p&gt;
&lt;p&gt;I&apos;ve been in love with the genre ever since, and quickly taught myself C just so I could hack on my own. MUDs are the reason that I not only learned how to code, but how to type, how to use Linux, how to run a server, how to write, and so many of the other skills that kicked off my career.&lt;/p&gt;
&lt;p&gt;MUDs, like Linux, have variants, distributions, and derivatives. My favorite &amp;quot;family&amp;quot; was called &lt;a href=&quot;//en.wikipedia.org/wiki/DikuMUD&quot;&gt;DikuMUD&lt;/a&gt;, which was originally created by a group of nerds at the department of computer science at the University of Copenhagen.&lt;/p&gt;
&lt;p&gt;The game I grew up playing and hacking on was a great-great-grandchild of Diku called &amp;quot;Entropy of the Soul&amp;quot;, or EotS for short.&lt;/p&gt;
&lt;p&gt;The way the data for Diku MUDs was structured was through text files using a proprietary file structure. No CSVs or JSONs or XML, just whatever the random assortment of developers chose to do throughout the years. Here&apos;s a little snapshot of what an &amp;quot;area&amp;quot; file looks like:&lt;/p&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;#ROOMDATA
#25000
Temple of Bethaven~
Within this chamber stands the great and ancient Oracle.  He has stood in
this spot since long before the dawning of the Storm, and shall continue
into eternity.  Standing directly in the centre of the room is a huge altar
carved from one solid granite stone.  It&apos;s surface is carved with intricate
designs and symbols.  It is here that the citizens of Bethaven come to heal
and rest, and to share in the glory of eternity.  There is a door set into
the northern wall, with an inscription carved upon it.
~
0 1076102152 0
Rd     0
E
door~
The door bears an inscription which reads:
&amp;amp;BTo the Bethaven Botanical Gardens
~
D0
~
door~
3 0 14000
D1
~
~
0 0 25120
D2
~
~
0 0 25001
D3
~
~
0 0 25119
D4
~
~
0 0 25132
S
&lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;Hard to read, right?&lt;/p&gt;
&lt;p&gt;As you can see, this proprietary format means that reading the files without the game code can be a pain in the ass, and writing them even more so.&lt;/p&gt;
&lt;p&gt;So I decided to take Google&apos;s &lt;a href=&quot;//antigravity.google&quot;&gt;Antigravity&lt;/a&gt; for a spin by putting it to the task of creating an &amp;quot;area explorer&amp;quot; that takes these files and makes them visual. Like a family tree explorer, Antigravity generated a beautiful and highly usable system for importing area files, rendering the maps and other data in a meaningful way, and even created an export functionality.&lt;/p&gt;
&lt;p&gt;&lt;center class=&quot;i&quot;&gt;&lt;img src=&quot;/assets/img/posts/eots-explorer.png&quot; alt=&quot;Screenshot of EotS Explorer&quot; height=&quot;372&quot; width=&quot;760&quot; loading=&quot;lazy&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;The craziest part? The bulk of the work of understanding the files was done entirely by the agent. All I did was point it at the EotS source code, tell it what to build, and it got about 80% of the way on its own.&lt;/p&gt;
&lt;p&gt;About an hour&apos;s worth of prompt work later and I ended up with a gorgeous tool that I would have killed to have when I was just starting out.&lt;/p&gt;
&lt;p&gt;I&apos;m still in awe at how well this entire thing turned out.&lt;/p&gt;
&lt;p&gt;If you&apos;re interested in checking the project out, you can get to it on my &lt;a href=&quot;/projects.html&quot;&gt;projects&lt;/a&gt; page, or find it directly &lt;a href=&quot;/experiments/eots-explorer/index.html&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;If you like this post or one of my projects, you can &lt;a href=&quot;https://www.buymeacoffee.com/zachflower&quot;&gt;buy me a coffee&lt;/a&gt;, or &lt;a href=&quot;mailto:zach@flower.codes&quot;&gt;send me a note&lt;/a&gt;. I&apos;d love to hear from you!&lt;/a&gt;</content>
    <author>
      <name>Zachary Flower</name>
    </author>
    <category term="ai" />
    <category term="development" />
    <category term="mud" />
    <summary type="html">Some of you know this, but I got into computing after being exposed to MUDs in the late 90&apos;s. For the uninitiated, MUDs were the text-based precursors to MMORPGs like Everquest and World of Warcraft—in fact, Everquest was even sued by one of the progenitors of the entire genre because the game, while graphical, had elements that were so eerily similar.</summary>
  </entry>
  <entry>
    <title type="html">Elseless</title>
    <link href="http://flower.codes/2026/01/04/elseless.html" rel="alternate" type="text/html" title="Elseless" />
    <published>2026-01-04T15:21:00+00:00</published>
    <updated>2026-01-04T15:21:00+00:00</updated>
    <id>http://flower.codes/2026/01/04/elseless</id><content type="html" xml:base="http://flower.codes/2026/01/04/elseless.html">&lt;p&gt;Here&apos;s a little &amp;quot;cognitive complexity&amp;quot; tip for your next programming project: get rid of your else statements.&lt;/p&gt;
&lt;p&gt;Okay... maybe not all of them. But as many as you can, because unnecessary else statements can decrease the readability of your code in small, but often very meaningful, ways.&lt;/p&gt;
&lt;p&gt;This isn&apos;t a hard-and-fast rule—which was made abundantly clear when I posted this on &lt;a href=&quot;https://www.linkedin.com/posts/zachflower_coding-development-softwaredevelopment-activity-7408885383658344448-3mp5&quot;&gt;LinkedIn&lt;/a&gt; and triggered a small flame war—but when I write my own code, I tend to keep the following guidelines in mind to keep else-driven cognitive complexity down:&lt;/p&gt;
&lt;h2 id=&quot;return-or-raise-early&quot;&gt;Return or raise early?&lt;/h2&gt;
&lt;p&gt;If returning or raising from within an if block, you can often drop the else and unindent the remainder.&lt;/p&gt;
&lt;h4 id=&quot;before&quot;&gt;Before&lt;/h4&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;process&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;value&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;):&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;value&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;is&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;None&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;raise&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;ValueError&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;value cannot be None&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;else&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;value&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#ae81ff&quot;&gt;2&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;h4 id=&quot;after&quot;&gt;After&lt;/h4&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;process&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;value&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;):&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;value&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;is&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;None&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;raise&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;ValueError&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;value cannot be None&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;

    &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;value&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#ae81ff&quot;&gt;2&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;h2 id=&quot;continuebreak-inside-loops&quot;&gt;Continue/break inside loops?&lt;/h2&gt;
&lt;p&gt;Similar to the above rule, if you continue or break inside an if, you can often skip the else and put the “keep” logic after the guard.&lt;/p&gt;
&lt;h4 id=&quot;before&quot;&gt;Before&lt;/h4&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f92672&quot;&gt;for&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;item&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;in&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;items&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;not&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;is_valid&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;item&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;):&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;continue&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;else&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
      &lt;font color=&quot;#a6e22e&quot;&gt;process&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;item&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;h4 id=&quot;after&quot;&gt;After&lt;/h4&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f92672&quot;&gt;for&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;item&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;in&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;items&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;not&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;is_valid&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;item&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;):&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;continue&lt;/font&gt;

    &lt;font color=&quot;#a6e22e&quot;&gt;process&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;item&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;)&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;h2 id=&quot;assign-defaults-first&quot;&gt;Assign defaults first&lt;/h2&gt;
&lt;p&gt;An old &amp;quot;C&amp;quot; programming language convention: assign defaults first. When you do that, you can often avoid else statements entirely.&lt;/p&gt;
&lt;h4 id=&quot;before&quot;&gt;Before&lt;/h4&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;get_status&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;user&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;):&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;user&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;is_active&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
        &lt;font color=&quot;#ffffff&quot;&gt;status&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;active&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;else&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
        &lt;font color=&quot;#ffffff&quot;&gt;status&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;inactive&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;

    &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;status&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;h4 id=&quot;after&quot;&gt;After&lt;/h4&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;get_status&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;user&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;):&lt;/font&gt;
    &lt;font color=&quot;#ffffff&quot;&gt;status&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;inactive&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;

    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;user&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;is_active&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
        &lt;font color=&quot;#ffffff&quot;&gt;status&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;active&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;

    &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;status&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;Or, an even cleaner version, dropping the intermediate variable and using a guard clause:&lt;/p&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;get_status&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;user&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;):&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;user&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;is_active&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;active&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;

    &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;inactive&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;h2 id=&quot;guard-clauses-for-invalidedge-cases&quot;&gt;Guard clauses for invalid/edge cases?&lt;/h2&gt;
&lt;p&gt;If you have multiple branches to handle edge cases, consider using guard clauses to handle them first so the main path of your function is clear. What&apos;s a &amp;quot;guard clause&amp;quot;? It&apos;s just an if statement that returns or raises early.&lt;/p&gt;
&lt;h4 id=&quot;before&quot;&gt;Before&lt;/h4&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;calculate_discount&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;price&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;customer&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;):&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;customer&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;is_vip&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;price&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#ae81ff&quot;&gt;0.8&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;else&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;customer&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;is_loyal&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
            &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;price&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#ae81ff&quot;&gt;0.9&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;else&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
            &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;price&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;h4 id=&quot;after&quot;&gt;After&lt;/h4&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;calculate_discount&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;price&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;customer&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;):&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;customer&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;is_vip&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;price&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#ae81ff&quot;&gt;0.8&lt;/font&gt;

    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;customer&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;is_loyal&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;price&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#ae81ff&quot;&gt;0.9&lt;/font&gt;

    &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;price&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;h2 id=&quot;nested-ifelse-causing-indentation-creep&quot;&gt;Nested if/else causing indentation creep?&lt;/h2&gt;
&lt;p&gt;More indentation means more cognitive load. If you find yourself with nested if/else statements, see if you can convert inner branches to guard returns/raises and unwrap.&lt;/p&gt;
&lt;h4 id=&quot;before&quot;&gt;Before&lt;/h4&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;process_order&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;order&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;):&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;order&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#a6e22e&quot;&gt;is_valid&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;():&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;order&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#a6e22e&quot;&gt;is_in_stock&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;():&lt;/font&gt;
            &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;order&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#a6e22e&quot;&gt;payment_received&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;():&lt;/font&gt;
                &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;order&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#a6e22e&quot;&gt;ship&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;():&lt;/font&gt;
                    &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;Order shipped&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;
                &lt;font color=&quot;#f92672&quot;&gt;else&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
                    &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;Shipping failed&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;
            &lt;font color=&quot;#f92672&quot;&gt;else&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
                &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;Payment not received&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;else&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
            &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;Out of stock&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;else&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;Invalid order&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;h4 id=&quot;after&quot;&gt;After&lt;/h4&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;process_order&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;order&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;):&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;not&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;order&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#a6e22e&quot;&gt;is_valid&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;():&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;Invalid order&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;

    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;not&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;order&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#a6e22e&quot;&gt;is_in_stock&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;():&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;Out of stock&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;

    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#f92672&quot;&gt;not&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;order&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#a6e22e&quot;&gt;payment_received&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;():&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;Payment not received&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;

    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;order&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#a6e22e&quot;&gt;ship&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;():&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;Order shipped&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;else&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;Shipping failed&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;h2 id=&quot;both-branches-return-the-same-typevalue-shape&quot;&gt;Both branches return the same type/value shape?&lt;/h2&gt;
&lt;p&gt;Sometimes both branches of an if/else return the same type or shape of value. In those cases, I prefer two returns over a &lt;code&gt;return&lt;/code&gt; and &lt;code&gt;else&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;before&quot;&gt;Before&lt;/h4&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;get_user_status&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;user&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;):&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;user&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;is_active&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;active&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;else&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;inactive&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;
&lt;h4 id=&quot;after&quot;&gt;After&lt;/h4&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f92672&quot;&gt;def&lt;/font&gt; &lt;font color=&quot;#a6e22e&quot;&gt;get_user_status&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;user&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;):&lt;/font&gt;
    &lt;font color=&quot;#f92672&quot;&gt;if&lt;/font&gt; &lt;font color=&quot;#ffffff&quot;&gt;user&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;is_active&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;:&lt;/font&gt;
        &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;active&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;

    &lt;font color=&quot;#f92672&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;inactive&lt;/font&gt;&lt;font color=&quot;#e6db74&quot;&gt;&quot;&lt;/font&gt;
&lt;/pre&gt;&lt;/font&gt;&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;If you like this post or one of my projects, you can &lt;a href=&quot;https://www.buymeacoffee.com/zachflower&quot;&gt;buy me a coffee&lt;/a&gt;, or &lt;a href=&quot;mailto:zach@flower.codes&quot;&gt;send me a note&lt;/a&gt;. I&apos;d love to hear from you!&lt;/a&gt;</content>
    <author>
      <name>Zachary Flower</name>
    </author>
    <summary type="html">Here&apos;s a little &amp;quot;cognitive complexity&amp;quot; tip for your next programming project: get rid of your else statements.</summary>
  </entry>
  <entry>
    <title type="html">Code It Forward</title>
    <link href="http://flower.codes/2025/11/17/how-to-volunteer.html" rel="alternate" type="text/html" title="Code It Forward" />
    <published>2025-11-17T17:05:00+00:00</published>
    <updated>2025-11-17T17:05:00+00:00</updated>
    <id>http://flower.codes/2025/11/17/how-to-volunteer</id><content type="html" xml:base="http://flower.codes/2025/11/17/how-to-volunteer.html">&lt;p&gt;In the late Summer of 2020, still deep in the throes of the COVID-19 pandemic and dealing with a near constant sense of dread and anxiety, I had an appointment with my optometrist that changed the course of my life and career.&lt;/p&gt;
&lt;p&gt;After a few dozen rounds of &amp;quot;A or B, 1 or 2?&amp;quot;, he asked me if I still &amp;quot;worked with computers&amp;quot; for a living. I was a Principal Engineer at a cybersecurity company called Automox at the time (their first Principal Engineer, actually, nbd), which I figured qualified working with computers, and after responding in the affirmative, he told me that his son had been taking a computer science class at his high school.&lt;/p&gt;
&lt;p&gt;&amp;quot;Unfortunately,&amp;quot; he said, &amp;quot;the teacher seems to be ahead of the students in the curriculum by only a few weeks, so he&apos;s not learning as much as he&apos;d like.&amp;quot;&lt;/p&gt;
&lt;p&gt;I was shocked by the revelation, which brought a whole new meaning to the phrase &amp;quot;those who can&apos;t do, teach,&amp;quot; so I went home that day and sent an email out to every high school in my area, asking if I could volunteer in their computer science programs in some way. If I&apos;m being completely honest, I didn&apos;t actually know &lt;i&gt;how&lt;/i&gt; I could help (after all, I didn&apos;t have any teaching experience), but I just knew that I needed to get involved &lt;i&gt;somehow&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;I ultimately heard back from just &lt;i&gt;one&lt;/i&gt; school, but in that one act, I discovered a number of incredible (yet, to me, undiscovered) ways that Software and IT professionals can get involved in computer science classrooms. While my journey quickly led from volunteering in classrooms to actually &lt;i&gt;teaching&lt;/i&gt; one, I thought I&apos;d share some of the lessons learned, and highlight different ways that my former peers can lend their expertise to the next generation of engineers.&lt;/p&gt;
&lt;h2 id=&quot;sponsored-volunteer-programs&quot;&gt;&amp;quot;Sponsored&amp;quot; Volunteer Programs&lt;/h2&gt;
&lt;p&gt;There are a handful of formal programs that provide opportunities to get involved in computer science classrooms, but the two that I personally joined were Code.org (which seems to have actually decommissioned their volunteer program sometime in the last year or two) and &lt;a href=&quot;https://www.microsoft.com/en-us/teals&quot;&gt;Microsoft TEALS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If I&apos;m being perfectly honest, your mileage with programs like these will vary.&lt;/p&gt;
&lt;p&gt;In the 3-4 years I was on the Code.org volunteer list, I was only ever contacted by one middle school teacher to volunteer to teach at a STEM day that resulted in a two hour adventure through a blizzard, and the realization that teaching middle school just wasn&apos;t for me.&lt;/p&gt;
&lt;p&gt;As for Microsoft TEALS, I was never contacted to volunteer... ever.&lt;/p&gt;
&lt;h2 id=&quot;volunteering-at-the-source&quot;&gt;Volunteering at the Source&lt;/h2&gt;
&lt;p&gt;If you really want to have an impact, my recommendation is going direct to the source. From Kindergarten through Grade 12, nearly every school has some sort of STEM program that teaches computer science concepts. While I was (and am) more interested in the potential for real life change that students can experience at the high school level, I can promise you that elementary and middle schools need volunteers too; and, believe me, there are &lt;i&gt;many&lt;/i&gt; ways to get involved.&lt;/p&gt;
&lt;p&gt;The first thing you need to do is reach out not just to the schools in your area, but also to the school district itself, and even your state&apos;s Department of Education. While the state and district websites don&apos;t always have clear contact information, you can often find a page on volunteering, or even a general contact page that &lt;i&gt;will&lt;/i&gt; get routed to the right person (eventually). Keep an eye out for any page or person related to CTE (Career and Technical Education), ETMA (Engineering, Technology, and Media Arts), or STEM (Science, Technology, Engineering, and Mathematics); any of those will get you &lt;i&gt;much&lt;/i&gt; closer to a person who can connect you with the right people.&lt;/p&gt;
&lt;p&gt;At the school level, most school websites list the contact information for every teacher and staff member. You will want to send an email to &lt;i&gt;at least&lt;/i&gt; these people:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Any/all teachers teaching in STEM-related fields (think Computer Science, Robotics, Engineering, etc)&lt;/li&gt;
&lt;li&gt;The principal and associate/vice principal(s), who won&apos;t actually be the deciders, but &lt;i&gt;will&lt;/i&gt; increase your likelihood of getting a response (teachers are busy people, so getting ghosted is more about their workload than it is about their interest in receiving your support)&lt;/li&gt;
&lt;li&gt;Some schools titles like &amp;quot;Career Counselors&amp;quot; or &amp;quot;Work-Based Learning Specialists&amp;quot; or something like that, which are positions that help students plan their lives after high school and connect them with internships before graduation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyone outside the above sphere of influence &lt;i&gt;might&lt;/i&gt; pass on your email, but they are also just as likely to ignore it in the sea of thousands of other things they have to do. Don&apos;t take it personally.&lt;/p&gt;
&lt;h2 id=&quot;what-volunteering-looks-like&quot;&gt;What &amp;quot;Volunteering&amp;quot; Looks Like&lt;/h2&gt;
&lt;p&gt;Once you are in contact with a school (or schools), the next thing to do is figure out what level of involvement you actually want to have. If your work schedule is flexible, then maybe you want to spend time in the classroom as a guest lecturer or assistant, but if you&apos;d rather volunteer on your own time, then you might want to get involved as a program advisor, tutor, or after-school program mentor.&lt;/p&gt;
&lt;p&gt;Schools are happy to get any support they can from their communities, so you have options here, and are unlikely to get too much pressure to help more than you are able. So you understand the big picture, let&apos;s break down a few of the different volunteering capacities I mentioned above.&lt;/p&gt;
&lt;h3 id=&quot;guest-lecturing&quot;&gt;Guest Lecturing&lt;/h3&gt;
&lt;p&gt;Guest lecturing is pretty much exactly what it sounds like: you come into a classroom (physically or virtually), and give a lecture or lead a lesson on a topic of your choosing. My first classroom exposure was as a guest lecturer, where I gave a 30 minute talk on &amp;quot;Careers in Technology&amp;quot; to a high school computer science class.&lt;/p&gt;
&lt;p&gt;This is a great way to get your feet wet, and can be as simple as showing up and talking for a bit, or as involved as preparing slides, activities, and assignments. The key here is to coordinate with the teacher ahead of time to make sure your content aligns with their curriculum and the students&apos; current level of understanding.&lt;/p&gt;
&lt;p&gt;As a now-teacher, I can tell you that guest lecturers are &lt;i&gt;always&lt;/i&gt; appreciated, both for the content they bring, and for having one-less lesson to plan and grade.&lt;/p&gt;
&lt;h3 id=&quot;classroom-assistance&quot;&gt;Classroom Assistance&lt;/h3&gt;
&lt;p&gt;Sometimes, teachers have an activity or module that they already have to (or want to) teach, but could use an extra set of hands (or, more appropriate, an extra brain) to help answer student questions or provide one-on-one support.&lt;/p&gt;
&lt;p&gt;This is where classroom assistance comes in.&lt;/p&gt;
&lt;p&gt;It&apos;s not a formal role, per se, but more of an ad-hoc arrangement where you show up to a class session and help out as needed. This can be especially helpful in computer science classes, where both the students and teachers can have a wide range of skill levels and may need varying degrees of assistance.&lt;/p&gt;
&lt;h3 id=&quot;program-advising&quot;&gt;Program Advising&lt;/h3&gt;
&lt;p&gt;One of the requirements (at least in the state of Colorado) of a high quality Career and Technical Education (CTE) program is to have industry professionals involved in the program&apos;s development and execution. This is called a Program Advisory, and is an opportunity for industry professionals to lend their expertise to help shape the curriculum, provide feedback on equipment needs, and ensure that the program is aligned with current industry standards.&lt;/p&gt;
&lt;p&gt;I joined a program advisory at about the same time I started volunteering in classrooms, and I enjoyed hearing about the challenges and successes of the program from the teacher&apos;s perspective, while also connecting with other local professionals who were also invested in the program&apos;s success.&lt;/p&gt;
&lt;p&gt;An advisory will typically meet a few times a year, and while it&apos;s not a huge time commitment (a couple hours a semester), participation provides an opportunity to influence curriculum, certification paths, work-based learning opportunities, and even internship pipelines for students.&lt;/p&gt;
&lt;h3 id=&quot;tutoring-and-mentoring&quot;&gt;Tutoring and Mentoring&lt;/h3&gt;
&lt;p&gt;If you have the time and inclination, one-on-one tutoring or mentoring can be an incredibly rewarding way to give back. This can take many forms, from helping a student with homework or projects, to providing guidance on college applications and career paths.&lt;/p&gt;
&lt;p&gt;The next-evolution of my volunteering journey was becoming a mentor for an after-school coding club that the high school I was involved with had recently started. This was a once-a-week club, where students would come together and build a project of their choosing, with me acting as a resource and guide. Students could ask questions, get help with coding challenges, and learn about best practices in software development. It was a blast, because every one of them &lt;i&gt;chose&lt;/i&gt; to be there, rather than being required to attend a class.&lt;/p&gt;
&lt;h2 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Volunteering in computer science classrooms is a fantastic way to give back to your community, inspire the next generation of engineers, and stay connected to the ever-evolving world of technology. Whether you choose to guest lecture, assist in the classroom, advise a program, or mentor students, your expertise and experience can make a significant impact.&lt;/p&gt;
&lt;p&gt;If you would like to volunteer, but aren&apos;t sure where to start, or don&apos;t have any particular affinity for connecting in your own district (or your district doesn&apos;t have any computer science programs), I am always looking for new advisors, mentors, and guest lecturers for my own classroom.&lt;/p&gt;
&lt;p&gt;Feel free to reach out to me via email at &lt;a href=&quot;mailto:zach.flower@jeffco.k12.co.us&quot;&gt;zach.flower@jeffco.k12.co.us&lt;/a&gt;, or connect with me on &lt;a href=&quot;https://www.linkedin.com/in/zachflower/&quot;&gt;LinkedIn&lt;/a&gt;, and we can figure something out!&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;If you like this post or one of my projects, you can &lt;a href=&quot;https://www.buymeacoffee.com/zachflower&quot;&gt;buy me a coffee&lt;/a&gt;, or &lt;a href=&quot;mailto:zach@flower.codes&quot;&gt;send me a note&lt;/a&gt;. I&apos;d love to hear from you!&lt;/a&gt;</content>
    <author>
      <name>Zachary Flower</name>
    </author>
    <summary type="html">In the late Summer of 2020, still deep in the throes of the COVID-19 pandemic and dealing with a near constant sense of dread and anxiety, I had an appointment with my optometrist that changed the course of my life and career.</summary>
  </entry>
  <entry>
    <title type="html">Spinning up an Onion Mirror is Stupid Easy</title>
    <link href="http://flower.codes/2025/10/23/onion-mirror.html" rel="alternate" type="text/html" title="Spinning up an Onion Mirror is Stupid Easy" />
    <published>2025-10-23T13:18:00+00:00</published>
    <updated>2025-10-23T13:18:00+00:00</updated>
    <id>http://flower.codes/2025/10/23/onion-mirror</id><content type="html" xml:base="http://flower.codes/2025/10/23/onion-mirror.html">&lt;p&gt;I recently spun up a .onion mirror of this website.&lt;/p&gt;
&lt;p&gt;Why? Because why not. And also because I can. Oh, and free speech and anti-censorship and all that jazz.&lt;/p&gt;
&lt;p&gt;I&apos;d like to pretend that it was some grand technological challenge, but if I&apos;m being entirely candid, it was like 3 commands and 4 lines of configuration.&lt;/p&gt;
&lt;p&gt;If you, too, would like to become a member of the dark web, here&apos;s how I did it:&lt;/p&gt;
&lt;h2 id=&quot;0-prerequisites&quot;&gt;0. Prerequisites&lt;/h2&gt;
&lt;p&gt;Before we jump into the &amp;quot;how&amp;quot; of it all, I should probably provide a brief overview of what my stack looked like before I entered The Onionverse:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Web Server&lt;/b&gt;: I&apos;ve been using &lt;a href=&quot;https://caddyserver.com/&quot;&gt;Caddy&lt;/a&gt; for a few years now, because it&apos;s significantly easier to configure than Nginx or Apache, and it has first-class support for modern web features like automatic HTTPS via Let&apos;s Encrypt.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hosting&lt;/b&gt;: My site is hosted on a VPS from &lt;a href=&quot;https://www.digitalocean.com/&quot;&gt;DigitalOcean&lt;/a&gt;, which gives me full control over the server environment. It&apos;s supposed to cost $4/mo, but I&apos;m taking some classes at Ye Olde Community College, so I have a few years of credits to cover the cost.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Operating System&lt;/b&gt;: My server runs Debian. I like Debian. If you aren&apos;t using an apt-based distro, then you&apos;ll need to adjust the package installation commands accordingly (but the Tor and Caddy configurations should be the same).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;1-install-tor&quot;&gt;1. Install Tor&lt;/h2&gt;
&lt;p&gt;First things first, we need to install Tor. On Debian, it&apos;s right in the default repositories:&lt;/p&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f6aa11&quot;&gt;sudo &lt;/font&gt;apt update
&lt;font color=&quot;#f6aa11&quot;&gt;sudo &lt;/font&gt;apt &lt;font color=&quot;#f6aa11&quot;&gt;install &lt;/font&gt;tor
&lt;/pre&gt;&lt;/font&gt;
&lt;h2 id=&quot;2-configure-tor&quot;&gt;2. Configure Tor&lt;/h2&gt;
&lt;p&gt;Next, we need to configure Tor to create a hidden service for our website. Open the Tor configuration file (&lt;code&gt;/etc/tor/torrc&lt;/code&gt;) in your favorite CLI text editor (it better be &lt;code&gt;vim&lt;/code&gt;, or you are dead to me). I have no interest in running a relay or exit node on my VPS, so I made some minimal changes to the config file, which should look something like this (comments removed for clarity):&lt;/p&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#75715e&quot;&gt;# Disable SOCKS proxy since we aren&apos;t making outbound connections&lt;/font&gt;
&lt;font color=&quot;#75715e&quot;&gt;# through Tor&lt;/font&gt;
SocksPort 0

&lt;font color=&quot;#75715e&quot;&gt;# Make sure Tor runs as a daemon (i.e. in the background)&lt;/font&gt;
RunAsDaemon 1

&lt;font color=&quot;#75715e&quot;&gt;# Setup the hidden service on port 80, this is where we tell Tor to&lt;/font&gt;
&lt;font color=&quot;#75715e&quot;&gt;# create a .onion service for our web server&lt;/font&gt;
HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80

&lt;font color=&quot;#75715e&quot;&gt;# Disable inbound connections, since we aren&apos;t running a relay or&lt;/font&gt;
&lt;font color=&quot;#75715e&quot;&gt;# exit node&lt;/font&gt;
ORPort 0

&lt;font color=&quot;#75715e&quot;&gt;# Disable directory services, since we won&apos;t be mirroring directory&lt;/font&gt;
&lt;font color=&quot;#75715e&quot;&gt;# information to other Tor nodes&lt;/font&gt;
DirPort 0
&lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;That&apos;s it. Everything else should be commented out using &lt;code&gt;#&lt;/code&gt; characters.&lt;/p&gt;
&lt;h2 id=&quot;3-restart-tor&quot;&gt;3. Restart Tor&lt;/h2&gt;
&lt;p&gt;Now we need to restart the Tor service to apply our changes:&lt;/p&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f6aa11&quot;&gt;sudo &lt;/font&gt;systemctl restart tor
&lt;/pre&gt;&lt;/font&gt;
&lt;h2 id=&quot;4-get-your-onion-address&quot;&gt;4. Get Your .onion Address&lt;/h2&gt;
&lt;p&gt;After Tor restarts, it will generate a new hidden service for us. We can find our new .onion address in the &lt;code&gt;HiddenServiceDir&lt;/code&gt; we specified earlier (&lt;code&gt;/var/lib/tor/hidden_service/&lt;/code&gt;). This directory is only readable by the &lt;code&gt;debian-tor&lt;/code&gt; user, so we&apos;ll need to use &lt;code&gt;sudo&lt;/code&gt; to read the &lt;code&gt;hostname&lt;/code&gt; file inside:&lt;/p&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;&lt;font color=&quot;#f6aa11&quot;&gt;sudo cat&lt;/font&gt; /var/lib/tor/hidden_service/hostname
&lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;What will be printed to the terminal is your new .onion address. It should look something like this:&lt;/p&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;jytkco7clxwj4hhzaydhk4kr3hwzsdzyvtsc6zn2ivog5uma5pxowzad.onion
&lt;/pre&gt;&lt;/font&gt;
&lt;h2 id=&quot;5-configure-caddy&quot;&gt;5. Configure Caddy&lt;/h2&gt;
&lt;p&gt;My Caddy server serves my website on port 80 without any IP or domain restrictions, so I don&apos;t need to make any changes to my Caddy configuration, however if you explicitly set up your Caddy server to only respond to certain domains or IP addresses, you&apos;ll need to add a new site block for your .onion address, which will look something like this:&lt;/p&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;http://jytkco7clxwj4hhzaydhk4kr3hwzsdzyvtsc6zn2ivog5uma5pxowzad.onion:80 {
  # Set up a reverse proxy, or serve static files, etc.
}
&lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;Because you can&apos;t get HTTPS certificates for .onion addresses, you&apos;ll need to serve your site over plain HTTP. I&apos;m not sure if this is generally considered acceptable within the Tor network (maybe one of my tens of readers can enlighten me), but I don&apos;t require HTTPS for my site anyway, so it works for my purposes.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Update (2025-10-31):&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;I received an email yesterday from &lt;a href=&quot;https://www.immibis.com&quot;&gt;immibis&lt;/a&gt; with some additional information about how Tor actually works, so I thought I&apos;d share for anyone else who is also just dipping their toes into the onion:&lt;/p&gt;
&lt;blockquote&gt;&lt;font color=&quot;#808080&quot;&gt;&lt;em&gt;
&lt;p&gt;This is considered perfectly acceptable. Tor already provides encryption between the end user&apos;s Tor daemon and your own, which is at least as good as TLS.&lt;/p&gt;
&lt;p&gt;The address is linked to the private key - which is also found in your hidden service directory next to the hostname - forever and always. Anyone who knows the private key of a .onion address can impersonate it, and anyone who doesn&apos;t know it, can&apos;t.&lt;/p&gt;
&lt;/em&gt;&lt;/font&gt;&lt;/blockquote&gt;
&lt;h2 id=&quot;6-optional-advertise-your-onion-address&quot;&gt;6. (Optional) Advertise Your .onion Address&lt;/h2&gt;
&lt;p&gt;If you want people to find your .onion site, you&apos;ll need to advertise it somewhere. I&apos;m a fan of subtlety, so I set up an &lt;code&gt;Onion-Location&lt;/code&gt; header on my main site that points to my .onion address. This way, anyone visiting my regular site with a Tor-enabled browser will automatically be informed of the existence of my .onion mirror without any intrusive pop-ups, banners, or additional UI elements.&lt;/p&gt;
&lt;p&gt;To do this, you&apos;ll want to add a header to your main Caddy site block like so:&lt;/p&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;&lt;pre&gt;header {
  Onion-Location http://jytkco7clxwj4hhzaydhk4kr3hwzsdzyvtsc6zn2ivog5uma5pxowzad.onion{uri}
}
&lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;The reason I tack on that &lt;code&gt;{uri}&lt;/code&gt; at the end is so that if someone visits a specific page on my main site (e.g. &lt;code&gt;https://flower.codes/some-post&lt;/code&gt;), the &lt;code&gt;Onion-Location&lt;/code&gt; header will point them to the equivalent page on my .onion site (&lt;code&gt;http://jytkco7clxwj4hhzaydhk4kr3hwzsdzyvtsc6zn2ivog5uma5pxowzad.onion/some-post&lt;/code&gt;), which (at least to me) adds some polish to the experience.&lt;/p&gt;
&lt;h2 id=&quot;7-profit&quot;&gt;7. Profit!&lt;/h2&gt;
&lt;p&gt;Just kidding.&lt;/p&gt;
&lt;p&gt;At this point, your .onion mirror should be up and running. You can test it out by visiting your .onion address in any Tor-enabled browser (like the &lt;a href=&quot;https://www.torproject.org/download/&quot;&gt;Tor Browser&lt;/a&gt; or even &lt;a href=&quot;https://brave.com/&quot;&gt;Brave&lt;/a&gt;, which has built-in Tor support).&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;If you like this post or one of my projects, you can &lt;a href=&quot;https://www.buymeacoffee.com/zachflower&quot;&gt;buy me a coffee&lt;/a&gt;, or &lt;a href=&quot;mailto:zach@flower.codes&quot;&gt;send me a note&lt;/a&gt;. I&apos;d love to hear from you!&lt;/a&gt;</content>
    <author>
      <name>Zachary Flower</name>
    </author>
    <category term="privacy" />
    <category term="censorship" />
    <category term="free speech" />
    <summary type="html">I recently spun up a .onion mirror of this website.</summary>
  </entry>
  <entry>
    <title type="html">Maybe We Should Stop Banning Books?</title>
    <link href="http://flower.codes/2025/10/20/banned-books.html" rel="alternate" type="text/html" title="Maybe We Should Stop Banning Books?" />
    <published>2025-10-20T21:47:00+00:00</published>
    <updated>2025-10-20T21:47:00+00:00</updated>
    <id>http://flower.codes/2025/10/20/banned-books</id><content type="html" xml:base="http://flower.codes/2025/10/20/banned-books.html">&lt;p&gt;Banned Books Week was like... a week and a half ago, but I missed it because I don&apos;t pay enough attention to arbitrary days of observance.&lt;/p&gt;
&lt;p&gt;My bad.&lt;/p&gt;
&lt;p&gt;I have some thoughts, though, and thought I&apos;d take the opportunity to share them, despite their fashionably late arrival.&lt;/p&gt;
&lt;p&gt;For absolutely no reason—none whatsoever—I&apos;ve been thinking a lot about censorship and freedom of expression in the United States lately.&lt;/p&gt;
&lt;blockquote&gt;&lt;font color=&quot;#808080&quot;&gt;&lt;em&gt;
&lt;p&gt;&lt;i&gt;&amp;quot;Congress shall make no law respecting an establishment of religion, or prohibiting the free exercise thereof; or abridging the freedom of speech, or of the press; or the right of the people peaceably to assemble, and to petition the Government for a redress of grievances.&amp;quot;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;— First Amendment to the United States Constitution&lt;/p&gt;
&lt;/em&gt;&lt;/font&gt;&lt;/blockquote&gt;
&lt;p&gt;Because I&apos;m a fully formed human being with an over-developed sense of empathy, I think that free speech can be a complicated issue.&lt;/p&gt;
&lt;p&gt;On one hand, it&apos;s important to protect the right to express diverse opinions and ideas, even if they are controversial or unpopular. On the other hand, I agree that some forms of speech—such as incitement to violence—don&apos;t deserve those protections due to the extreme harm they can cause.&lt;/p&gt;
&lt;p&gt;One thing to be clear on, though, is that incitement to violence is &lt;i&gt;not the same&lt;/i&gt; as offensive speech. The two are often conflated, but they are very different concepts. Incitement to violence refers to speech that is intended to provoke or encourage others to &lt;i&gt;commit acts of violence&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Jokes&lt;/b&gt; do not count as incitement to violence.&lt;br /&gt;
&lt;b&gt;Satire&lt;/b&gt; does not count as incitement to violence.&lt;br /&gt;
&lt;b&gt;Parody&lt;/b&gt; does not count as incitement to violence.&lt;br /&gt;
&lt;b&gt;Art&lt;/b&gt; does not count as incitement to violence.&lt;br /&gt;
&lt;b&gt;Criticism&lt;/b&gt; does not count as incitement to violence.&lt;br /&gt;
&lt;b&gt;Dissent&lt;/b&gt; does not count as incitement to violence.&lt;br /&gt;
&lt;b&gt;Protest&lt;/b&gt; does not count as incitement to violence.&lt;/p&gt;
&lt;p&gt;Unfortunately, even hate speech does not count as incitement to violence; I do hate that.&lt;/p&gt;
&lt;p&gt;I hate the othering of already marginalized groups, and conspiracy theories that spread dangerous misinformation, and outright lies meant to manipulate and mislead, and hateful rhetoric that seeks to divide us. I hate that some people use their words to hurt other people, and I hate how much hate there is in the world.&lt;/p&gt;
&lt;p&gt;But I also hate the idea that it is okay silence people just because we disagree with them—even if what we disagree with is disgusting on its face—because that means &lt;i&gt;someone&lt;/i&gt; gets to decide what is acceptable speech and what is not, and who the hell could we possibly trust to draw that line?&lt;/p&gt;
&lt;p&gt;If we&apos;re being &lt;i&gt;completely&lt;/i&gt; honest with ourselves: nobody.&lt;/p&gt;
&lt;p&gt;If you don&apos;t like what someone is saying, the answer is not to silence them. The answer is to engage with their ideas, to respectfully challenge them, and to present your own perspective.&lt;/p&gt;
&lt;p&gt;Or just fucking ignore them, because our attention is free expression too (we may have to &lt;i&gt;allow&lt;/i&gt; speech we disagree with, but we don&apos;t have to personally &lt;i&gt;tolerate&lt;/i&gt; it).&lt;/p&gt;
&lt;p&gt;Book banning is a great example of this.&lt;/p&gt;
&lt;p&gt;When books are banned, it&apos;s because they contain ideas or perspectives that some people find offensive or uncomfortable, and they want to prevent others from being exposed to those same ideas. But exposure is not the same as endorsement, or agreement, or (the word of the decade) &lt;i&gt;indoctrination&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Instead of banning books, we should be encouraging critical thinking and open dialogue about the ideas they contain. We should be teaching people how to evaluate information, how to recognize bias and misinformation, and how to engage in respectful debate.&lt;/p&gt;
&lt;p&gt;The last thing we should be doing is trying to silence voices we don&apos;t like, even if those voices are loud and obnoxious and downright hateful (which, let&apos;s be clear, books advocating for equal rights, justice, and human dignity are absolutely none of those things, regardless of how uncomfortable they make someone in their world view).&lt;/p&gt;
&lt;p&gt;Because the reason we have to allow the speech we &lt;i&gt;don&apos;t&lt;/i&gt; agree with is so we can continue to share the speech we &lt;i&gt;do&lt;/i&gt; agree with. It&apos;s not about &lt;i&gt;them&lt;/i&gt; vs. &lt;i&gt;us&lt;/i&gt;; it&apos;s about &lt;i&gt;all of us&lt;/i&gt;, and when we lose sight of that (like how things often feel today), then we all lose.&lt;/p&gt;
&lt;p&gt;I don&apos;t &lt;a href=&quot;/library.html&quot;&gt;read enough banned books&lt;/a&gt;, and I definitely don&apos;t read enough books that challenge my worldview (can anyone?), but I do read some, and would like to read more.&lt;/p&gt;
&lt;p&gt;I encourage you to do the same.&lt;/p&gt;
&lt;!--
  Not sure where to start? Here&apos;s a list of some of the most frequently banned books in the United States, most of which are on my &quot;to read&quot; list:
  - &quot;Brave New World&quot; by Aldous Huxley
  - &quot;Carrie&quot; by Stephen King
  - &quot;The Catchers in the Rye&quot; by J.D. Salinger
  - &quot;A Clockwork Orange&quot; by Anthony Burgess
  - &quot;The Diary of Anne Frank&quot; by Anne Frank
  - &quot;Ender&apos;s Game&quot; by Orson Scott Card
  - &quot;Fahrenheit 451&quot; by Ray Bradbury
  - &quot;The Giver&quot; by Lois Lowry
  - &quot;The Handmaid&apos;s Tale&quot; by Margaret Atwood
  - &quot;I Know Why the Caged Bird Sings&quot; by Maya Angelou
  - &quot;James and the Giant Peach&quot; by Roald Dahl
  - &quot;Julie of the Wolves&quot; by Jean Craighead George
  - &quot;The Kite Runner&quot; by Khaled Hosseini
  - &quot;Lord of the Flies&quot; by William Golding
  - &quot;Nineteen Eighty-Four&quot; by George Orwell
  - &quot;Of Mice and Men&quot; by John Steinbeck
  - &quot;One Flew Over the Cuckoo&apos;s Nest&quot; by Ken Kesey
  - &quot;The Perks of Being a Wallflower&quot; by Stephen Chbosky
  - &quot;Scary Stories to Tell in the Dark&quot; by Alvin Schwartz
  - &quot;Slaughterhouse-Five&quot; by Kurt Vonnegut
  - &quot;To Kill a Mockingbird&quot; by Harper Lee
  - &quot;The Witches&quot; by Roald Dahl
  - &quot;A Wrinkle in Time&quot; by Madeleine L&apos;Engle
--&gt;&lt;p&gt;Because the more we read, the more we can understand each other&apos;s pain and frustration and fear and troubles, and the more we understand that, the more we can find a way through the garbage fire we are all experiencing at the moment.&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;If you like this post or one of my projects, you can &lt;a href=&quot;https://www.buymeacoffee.com/zachflower&quot;&gt;buy me a coffee&lt;/a&gt;, or &lt;a href=&quot;mailto:zach@flower.codes&quot;&gt;send me a note&lt;/a&gt;. I&apos;d love to hear from you!&lt;/a&gt;</content>
    <author>
      <name>Zachary Flower</name>
    </author>
    <category term="censorship" />
    <category term="free speech" />
    <category term="books" />
    <summary type="html">Banned Books Week was like... a week and a half ago, but I missed it because I don&apos;t pay enough attention to arbitrary days of observance.</summary>
  </entry>
  <entry>
    <title type="html">Hacker High School</title>
    <link href="http://flower.codes/2025/10/17/hacker-high-school.html" rel="alternate" type="text/html" title="Hacker High School" />
    <published>2025-10-17T15:41:00+00:00</published>
    <updated>2025-10-17T15:41:00+00:00</updated>
    <id>http://flower.codes/2025/10/17/hacker-high-school</id><content type="html" xml:base="http://flower.codes/2025/10/17/hacker-high-school.html">&lt;p&gt;This article was originally published in &lt;a href=&quot;https://store.2600.com/products/autumn-2025&quot;&gt;2600 Magazine, Autumn 2025&lt;/a&gt;. I had originally just sent it in as a proposal for a larger series, but they published it as-is, so it reads a bit weird.&lt;/p&gt;
&lt;p&gt;Who am I to argue with their editorial decisions, though?&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;hr size=&quot;1&quot; noshade /&gt;
&lt;p&gt;&lt;b&gt;Course&lt;/b&gt;: Hacker High School&lt;br /&gt;
&lt;b&gt;Room&lt;/b&gt;: &lt;code&gt;/dev/null&lt;/code&gt;&lt;br /&gt;
&lt;b&gt;Prerequisites&lt;/b&gt;: Curiosity, disrespect for authority, basic terminal fluency&lt;br /&gt;
&lt;b&gt;Warning&lt;/b&gt;: This course may violate district policy, state standards, and the laws of physics.&lt;/p&gt;
&lt;h2 id=&quot;course-description&quot;&gt;Course Description&lt;/h2&gt;
&lt;p&gt;This document was not approved by the school board. It was not submitted for review, not listed in Google Classroom, and as far as your parents are concerned, doesn&apos;t exist. If you&apos;re reading it, you either made a wrong turn in the curriculum database or you know exactly where you&apos;re supposed to be.&lt;/p&gt;
&lt;p&gt;Hacker High School is a semester-long immersion into subversive computing, inspired by over four decades of 2600: The Hacker Quarterly. Every lesson is real. Every exploit has been tested in the field—often by teenagers with too much time and too little supervision. This is not about theory. This is about doing.&lt;/p&gt;
&lt;p&gt;The syllabus below outlines a full 18-week course blending system intrusion, digital disguise, network manipulation, and physical bypass—taught from behind a desk covered in stickers and caffeine residue. It is structured, thorough, and deeply unethical in the most ethical way possible.&lt;/p&gt;
&lt;p&gt;If anyone asks, we&apos;re teaching &amp;quot;digital literacy.&amp;quot;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;h3 id=&quot;week-2-mac-daddy&quot;&gt;Week 2: MAC Daddy&lt;/h3&gt;
&lt;p&gt;This week introduces the concept of identity at the hardware level. If last week was about controlling what you reveal, this week is about controlling who you appear to be—on the network, anyway. Students will learn how MAC addresses work, how they&apos;re used to fingerprint devices, and how to break that chain of trust.&lt;/p&gt;
&lt;p&gt;We&apos;re not asking permission to be on the network. We&apos;re showing up in disguise.&lt;/p&gt;
&lt;h4 id=&quot;themes&quot;&gt;Themes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Identity vs. identification&lt;/li&gt;
&lt;li&gt;Fingerprinting and tracking&lt;/li&gt;
&lt;li&gt;The futility of hardware-based trust&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;warmup&quot;&gt;Warmup&lt;/h4&gt;
&lt;blockquote&gt;&lt;font color=&quot;#808080&quot;&gt;&lt;em&gt;
&lt;p&gt;Run &lt;code&gt;ip link&lt;/code&gt; in your terminal. What brand is your network interface broadcasting? How often do you think it changes?&lt;/p&gt;
&lt;/em&gt;&lt;/font&gt;&lt;/blockquote&gt;
&lt;h4 id=&quot;tool-of-the-week&quot;&gt;Tool of the Week&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;macchanger&lt;/code&gt; – The classic utility for changing MAC addresses
&lt;b&gt;Alt&lt;/b&gt;: ip link + ifconfig combo – Because it&apos;s good to know what&apos;s underneath the wrappers&lt;/p&gt;
&lt;h4 id=&quot;required-reading&quot;&gt;Required Reading&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;DHCP is Your Friend!&amp;quot; - Volume 19, Number 4 (Winter 2002-2003)&lt;/li&gt;
&lt;li&gt;&amp;quot;Vulnerabilities in Subscription Wireless&amp;quot; - Volume 21, Number 4 (Winter 2004-2005)&lt;/li&gt;
&lt;li&gt;&amp;quot;MAC Address Changer&amp;quot; - Volume 25, Number 2 (Summer 2008)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;hands-on-objectives&quot;&gt;Hands-On Objectives&lt;/h4&gt;
&lt;p&gt;By the end of this week, you will have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identified your device&apos;s hardware MAC address&lt;/li&gt;
&lt;li&gt;Spoofed it to impersonate another device&lt;/li&gt;
&lt;li&gt;Used your new identity to bypass a basic access control system&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;prompt-for-reflection&quot;&gt;Prompt for Reflection&lt;/h4&gt;
&lt;blockquote&gt;&lt;font color=&quot;#808080&quot;&gt;&lt;em&gt;
&lt;p&gt;If you can change your device&apos;s identity at will, what&apos;s left of trust on the network?&lt;/p&gt;
&lt;/em&gt;&lt;/font&gt;&lt;/blockquote&gt;
&lt;h4 id=&quot;assignment&quot;&gt;Assignment&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;macchanger&lt;/code&gt; or a manual method to spoof your MAC address&lt;ul&gt;
&lt;li&gt;Connect to a restricted or captive portal network (in a sandboxed lab)&lt;/li&gt;
&lt;li&gt;Document how the network treated you differently—or didn&apos;t&lt;/li&gt;
&lt;li&gt;Reflect on the ease or difficulty of being someone else, digitally&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Bonus&lt;/b&gt;: Set up a cron job to randomize your MAC address on a regular interval. Then write a reflection on whether this has improved or hindered your experience online.&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;If you like this post or one of my projects, you can &lt;a href=&quot;https://www.buymeacoffee.com/zachflower&quot;&gt;buy me a coffee&lt;/a&gt;, or &lt;a href=&quot;mailto:zach@flower.codes&quot;&gt;send me a note&lt;/a&gt;. I&apos;d love to hear from you!&lt;/a&gt;</content>
    <author>
      <name>Zachary Flower</name>
    </author>
    <category term="education" />
    <category term="hacking" />
    <summary type="html">This article was originally published in 2600 Magazine, Autumn 2025. I had originally just sent it in as a proposal for a larger series, but they published it as-is, so it reads a bit weird.</summary>
  </entry>
</feed>