<?xml version="1.0" encoding="UTF-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <link href="https://www.fauxtrots.com/rss" rel="self" type="application/rss+xml" />
  <title>Fauxtrots</title>
  <updated>2/1/2026</updated>
  <author>
    <name>Emily Fauxtrots</name>
  </author>
  <link href="https://www.fauxtrots.com" />
  <id>urn:uuid:9e25c993-c1eb-4dd5-8b15-33c137ad75a8</id>

      <entry>
        <id>https://www.fauxtrots.com/blog/alienation</id>
        <title>Alienation and lethargy</title>
        <link href="https://www.fauxtrots.com/blog/alienation" />
        <summary>What do you do when you can't do anything?</summary>
        <updated>2/1/2026</updated>
        <content type="xhtml">
          <div xmlns="http://www.w3.org/1999/xhtml">
<p>I haven&#39;t been doing great lately.</p>
<p>I&#39;ve been thinking about writing a 2025 year-in-review post, but here we are in February, already
1/12 of the way through 2026. Time is both crawling past and blisteringly fast. In short, 2025 was
good in some ways, devestating in others. At the end of the year I went on a beautiful trip to
Vermont with family. Around the same time, my house developed two major leaks, one of which requires
replacing our roof to the tune of $20k.<sup class='sidenote-number'><a id="footnote-ref-1" href="#footnote-1" aria-describedby="footnote-label">1</a></sup><span class="sidenote">Did you know you can donate to <a href="https://ko-fi.com/fauxtrots">my KoFi</a>?</span> I&#39;ve been unemployed for over a year now, outside of
some minor gig work.<sup class='sidenote-number'><a id="footnote-ref-2" href="#footnote-2" aria-describedby="footnote-label">2</a></sup><span class="sidenote">Feel free to also <a href="mailto:hello@fauxtrots.com">reach out</a> with job opportunities!</span></p>
<p>Despite all of this free time, I&#39;ve been finding it difficult to get anything done. I&#39;m lethargic
but jittery, finding it difficult to avoid switching between tabs (literal and metaphorical) every
five seconds. About the only thing I&#39;ve been able to focus on in the past month has been <em>Hollow
Knight: Silksong</em>, having put in around 70 hours so far with more game left to play.</p>
<p>
        <figure>
          <span class="marginnote">It&#39;s just you and me now Hornet. Image from the
<a href="https://www.gameuidatabase.com/gameData.php?id=2178">Game UI Database</a></span>
          <img src="/images/silksong.jpg" alt="null" />
        </figure></p>
<p>The reasons I&#39;m feeling this way aren&#39;t anything too surprising. I&#39;ve had depression for years, and
while meds help, there&#39;s only so much they can do, especially when the underlying issues are all too
real. There&#39;s a fascist government in power, and trans people are one of their major targets. Goons
are disappearing people and killing them in the streets. More and more proof keeps being released
showing that there really is a small group of pedophilic elites with outsized effects on culture and
politics. On a smaller, more local level, the cold front and snowstorms washing across the eastern
US have been making it unpleasant to go outside or do anything. None of these problems are within my
individual power to solve, and while the scenes of solidarity and resistance occuring in Minneapolis
and elsewhere warm my heart, I feel powerless to do anything myself. I believe that all of these
conditions will end eventually, but none are pleasant to live through.</p>
<p>
        <figure>
          <span class="marginnote">Post from
<a href="https://www.tumblr.com/nitewrighter/779101283437150208/me-i-dont-get-it-i-thought-i-was-doing-a-lot">nitewrighter</a>
on tumblr</span>
          <img src="/images/it's_the_fascism.jpg" alt="null" />
        </figure></p>
<p>I don&#39;t really have a conclusion to this. Shit sucks. I&#39;m going to turn it around on you instead,
dear reader. What do you do when doing anything feels impossible?</p>
<hr />
<section class="footnotes" >
<h2 id="footnote-label" class="hidden">Footnotes</h2>
<ol>
<li id="footnote-1">
<p>Did you know you can donate to <a href="https://ko-fi.com/fauxtrots">my KoFi</a>? <a href="#footnote-ref-1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="footnote-2">
<p>Feel free to also <a href="mailto:hello@fauxtrots.com">reach out</a> with job opportunities! <a href="#footnote-ref-2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section>

          </div>
        </content>
      </entry>
      <entry>
        <id>https://www.fauxtrots.com/blog/meshtastic</id>
        <title>Meshtastic!</title>
        <link href="https://www.fauxtrots.com/blog/meshtastic" />
        <summary>Learning LoRa Networking at Iffy Books</summary>
        <updated>11/17/2025</updated>
        <content type="xhtml">
          <div xmlns="http://www.w3.org/1999/xhtml">
<p>I went to a mesh networking workshop over the weekend at <a href="https://iffybooks.net">Iffy Books</a><sup class='sidenote-number'><a id="footnote-ref-1" href="#footnote-1" aria-describedby="footnote-label">1</a></sup><span class="sidenote">They&#39;re an awesome leftist hacker bookstore here in Philly, definitely worth checking out if
    you&#39;re in the area, or <a href="https://iffybooks.net/donate/">supporting financially</a> so they can stick
    around.</span> and
had a great time! We all had/bought these <a href="https://en.wikipedia.org/wiki/LoRa">LoRa</a><sup class='sidenote-number'><a id="footnote-ref-2" href="#footnote-2" aria-describedby="footnote-label">2</a></sup><span class="sidenote">Short for Long Range. LoRa is a (proprietary) mesh networking radio communication technology.</span> devices
that we needed to set up. We flashed them with <a href="https://meshtastic.org/">Meshtastic</a> firmware and
went through the process of setting it all up. It was my first real experience with non-web
networking and it&#39;s already helping me imagine what else is possible.</p>
<p>
        <figure>
          <span class="marginnote">A <a href="https://heltec.org/project/wifi-lora-32-v3/">Heltec LoRa V3</a>. My wife says it looks like a vape and she&#39;s not wrong.</span>
          <img src="/images/heltech-lora-mesh.png" alt="null" />
        </figure></p>
<p>I&#39;m still ironing out the kinks with it for the moment. I want to put it high up in the house so
that it can (hopefully) transmit over more range, but the top floor of my rowhome is my bedroom, the
circuit board has several flashing lights, and the included case is not opaque. Right now it just
has a shirt thrown over it, but I&#39;d like to find a better solution to prevent the lights keeping me
up. It might come down to electrical tape or just buying a better case, but we&#39;ll see. I&#39;m also
running into a bug where I can&#39;t connect to it over bluetooth with the
<a href="https://play.google.com/store/apps/details?id=com.geeksville.mesh&amp;hl=en_US">app</a>, but after some
github snooping it seems like this is a known issue, so maybe I&#39;ll be able to find a solution.</p>
<p>After the workshop was over I felt inspired and bought a bunch more electronics for various
projects, hopefully some of which will grace these digital pages soon! I&#39;ve had a couple blog posts
simmering away recently so I think I&#39;m due for more activity here.</p>
<hr />
<section class="footnotes" >
<h2 id="footnote-label" class="hidden">Footnotes</h2>
<ol>
<li id="footnote-1">
<p>They&#39;re an awesome leftist hacker bookstore here in Philly, definitely worth checking out if
you&#39;re in the area, or <a href="https://iffybooks.net/donate/">supporting financially</a> so they can stick
around. <a href="#footnote-ref-1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="footnote-2">
<p>Short for Long Range. LoRa is a (proprietary) mesh networking radio communication technology. <a href="#footnote-ref-2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section>

          </div>
        </content>
      </entry>
      <entry>
        <id>https://www.fauxtrots.com/blog/link-timestamps</id>
        <title>Automating link timestamps: Part 2</title>
        <link href="https://www.fauxtrots.com/blog/link-timestamps" />
        <summary>How hard could it be to parse YAML?</summary>
        <updated>8/16/2025</updated>
        <content type="xhtml">
          <div xmlns="http://www.w3.org/1999/xhtml">
<p><em>This is a followup to my previous post about
<a href="/blog/automated-timestamps">Automating Blog Timestamps</a> and will make much more sense if you read
it first.</em></p>
<p>Last time I wrote a Perl script to add timestamps to new blog posts as they&#39;re committed to the git
repo for this site. But I also have a <a href="/links">links page</a><sup class='sidenote-number'><a id="footnote-ref-1" href="#footnote-1" aria-describedby="footnote-label">1</a></sup><span class="sidenote">Check it out, there&#39;s some cool stuff!</span> that&#39;s set up differently, so the
previous method of adding timestamps wouldn&#39;t work. Instead of each entry having its own file, links
are stored as an array in a YAML file<sup class='sidenote-number'><a id="footnote-ref-2" href="#footnote-2" aria-describedby="footnote-label">2</a></sup><span class="sidenote">Technically before this they were stored in an array in a JavaScript file, but don&#39;t nitpick.</span>, so we can&#39;t just add the timestamp to the top of a file
when it&#39;s added to the repo. Instead, we need to actually parse the document to see which entries
are new vs pre-existing. This began my descent into hell.</p>
<p>I didn&#39;t want to write a document parser myself, which meant it was time to learn how to find and
use Perl modules. After a bit of searching, it looked like <a href="https://metacpan.org/pod/CPAN">CPAN</a> was
the tool for the job. For some reason setting that up and establishing my environment took a long
time<sup class='sidenote-number'><a id="footnote-ref-3" href="#footnote-3" aria-describedby="footnote-label">3</a></sup><span class="sidenote">Just leaves more time for <a href="https://xkcd.com/303/">swordfights</a>.</span>, but whatever. First up I actually wanted to use JSON, not YAML. I went down a rabbit hole
trying to use <a href="https://metacpan.org/pod/JSON::PP">JSON::PP</a>, but for some reason I wasn&#39;t able to
read the data and go through it in a loop.<sup class='sidenote-number'><a id="footnote-ref-4" href="#footnote-4" aria-describedby="footnote-label">4</a></sup><span class="sidenote">This whole process was made more annoying by the fact that Perl apparently doesn&#39;t have a built
    in way to print (the contents of) arrays and hashes. I ended up using
    <a href="https://metacpan.org/pod/Data::Dump">Data::Dump</a> in order to actually see what a hash contained
    instead of <code>HASH(0x5584948e7788)</code>.</span> Apparently my desired data structure (an array of
hashes) isn&#39;t commonly used in perl-land. I probably could have made it work eventually, but at this
point I switched to trying out YAML.</p>
<p>Perl has several YAML parsing libraries<sup class='sidenote-number'><a id="footnote-ref-5" href="#footnote-5" aria-describedby="footnote-label">5</a></sup><span class="sidenote">Apparently the <a href="https://metacpan.org/pod/YAML">first YAML implementation</a> was in Perl!</span>, but I ended up going with
<a href="https://metacpan.org/pod/YAML::PP">YAML::PP</a>. First I created an instance of the library:</p>
<pre><code class="language-perl">use YAML::PP;
my $ypp = YAML::PP-&gt;new;
</code></pre>
<p>Then added in an elsif to the filetype conditional: <code>elsif ($file =~ /\.yaml$/)</code>. This is where the
trouble really started. Perl has three fundamental variable types which each have their own symbol
prefix: scalar (<code>$foo</code>), array (<code>$bar</code>), and hash (<code>%baz</code>). Figuring out how to use these symbols in
combination with each other was mostly achieved by trial and error, and I&#39;m still not 100% sure on
how it all works. Lets go through it line by line.</p>
<pre><code class="language-perl">my $links = $ypp-&gt;load_file($file);
</code></pre>
<p>This seems fine to begin with, but naively I would expect links to be an array, and thus be prefixed
with an <code>@</code>. However, if you do that you then run into trouble on the next line...</p>
<pre><code class="language-perl">foreach my $link (@$links) {
</code></pre>
<p>We&#39;re setting up a for loop here over the items in <code>$links</code>. Wait, that&#39;s... <code>@$links</code>? My
understanding is that <code>$links</code> is actually an array <em>reference</em>, and by adding the <code>@</code> prefix on
we&#39;re dereferencing it so that we can loop over the values. The current value in each iteration of
the loop is stored in <code>$link</code>. This <em>should</em> be a hash, but it seems that loop variables such as
this are also references, and such have to be defined as scalars.</p>
<pre><code class="language-perl">if (!%{$link}{&quot;createdAt&quot;}) {
</code></pre>
<p>Now we&#39;re checking if the current link hash contains a <code>createdAt</code> key. We again have to dereference
the variable into a hash. If the key isn&#39;t present we assume the link is new and move on to:</p>
<pre><code class="language-perl">$link-&gt;{&#39;createdAt&#39;} = $date;
</code></pre>
<p>Assigning the current timestamp to the hash. After that we dump the array out into the file again.
The first time I got this to work it created a YAML file composed of multiple documents; that is,
each link was separated by a <code>---</code>. Unfortunately that caused the JavaScript YAML parsing library
I&#39;m using<sup class='sidenote-number'><a id="footnote-ref-6" href="#footnote-6" aria-describedby="footnote-label">6</a></sup><span class="sidenote"><a href="https://github.com/figma/vite-plugin-yaml">@modyfi/vite-plugin-yaml</a></span> to not import correctly, so I had to futz around with it until I got to the current
state. Here&#39;s the final result:</p>
<pre><code class="language-perl">use YAML::PP;
my $ypp = YAML::PP-&gt;new;

my $date = time();
my @files = `git diff-index --cached --name-only HEAD`;

foreach my $filename (@files) {
  chomp $filename;
  if ($filename =~ /\.md$/) {

    ... code from previous post ...

  } elsif ($filename =~ /\.yaml$/) {
    my $links = $ypp-&gt;load_file($file); # array of links in file

    foreach my $link (@$links) {
        if (!%{$link}{&quot;createdAt&quot;}) {
            $link-&gt;{&#39;createdAt&#39;} = $date;
        }
    }

    $ypp-&gt;dump_file($file, $links);

    system &quot;git add $file&quot;;
  }
}
</code></pre>
<p>I also had to make a couple changes to my <code>.pre-commit-config.yaml</code> file. First, I added
<code>exclude: (.pre-commit-config.yaml)</code> at the top level so that the script wouldn&#39;t try to add a
timestamp to the config file itself. Next, I changed the <code>types</code> key for this hook to
<code>types_or: [markdown, yaml]</code>.</p>
<p>Overall I&#39;m happy with how this turned out, but I hope that I won&#39;t have to touch this script (or
Perl in general tbh) again for a long time.</p>
<hr />
<section class="footnotes" >
<h2 id="footnote-label" class="hidden">Footnotes</h2>
<ol>
<li id="footnote-1">
<p>Check it out, there&#39;s some cool stuff! <a href="#footnote-ref-1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="footnote-2">
<p>Technically before this they were stored in an array in a JavaScript file, but don&#39;t nitpick. <a href="#footnote-ref-2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="footnote-3">
<p>Just leaves more time for <a href="https://xkcd.com/303/">swordfights</a>. <a href="#footnote-ref-3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="footnote-4">
<p>This whole process was made more annoying by the fact that Perl apparently doesn&#39;t have a built
in way to print (the contents of) arrays and hashes. I ended up using
<a href="https://metacpan.org/pod/Data::Dump">Data::Dump</a> in order to actually see what a hash contained
instead of <code>HASH(0x5584948e7788)</code>. <a href="#footnote-ref-4" aria-label="Back to reference 4">↩</a></p>
</li>
<li id="footnote-5">
<p>Apparently the <a href="https://metacpan.org/pod/YAML">first YAML implementation</a> was in Perl! <a href="#footnote-ref-5" aria-label="Back to reference 5">↩</a></p>
</li>
<li id="footnote-6">
<p><a href="https://github.com/figma/vite-plugin-yaml">@modyfi/vite-plugin-yaml</a> <a href="#footnote-ref-6" aria-label="Back to reference 6">↩</a></p>
</li>
</ol>
</section>

          </div>
        </content>
      </entry>
      <entry>
        <id>https://www.fauxtrots.com/blog/against-ai</id>
        <title>Our actions today create the world tomorrow</title>
        <link href="https://www.fauxtrots.com/blog/against-ai" />
        <summary>So why do we make it so shitty?</summary>
        <updated>7/27/2025</updated>
        <content type="xhtml">
          <div xmlns="http://www.w3.org/1999/xhtml">
<p><em>I&#39;ve been working on this post for months and it keeps getting longer and longer; it might not be
done but I need to publish it eventually.</em></p>
<p>I&#39;ve got a Google Nest Mini<sup class='sidenote-number'><a id="footnote-ref-1" href="#footnote-1" aria-describedby="footnote-label">1</a></sup><span class="sidenote">Could&#39;ve sworn it was called a Google Home but apparently not.</span> in my bedroom. It doesn&#39;t get a <em>ton</em> of use, but it&#39;s nice to be
able to check the weather forecast in the morning, or play music at night, without having to get out
of bed and fiddle with anything. But over the past year I&#39;ve noticed a significant decline in its
usability (and it&#39;s <a href="https://sherwood.news/tech/google-assistant-is-bad-now-but-why/">not</a>
<a href="https://www.reddit.com/r/googlehome/comments/1fxrjm2/google_home_have_gotten_worse/">just</a>
<a href="https://www.googlenestcommunity.com/t5/Speakers-and-Displays/Google-Home-assistant-is-getting-worse-and-worse/m-p/486401">me</a>).
Commands that once worked flawlessly (&quot;Google, stop timer.&quot;<sup class='sidenote-number'><a id="footnote-ref-2" href="#footnote-2" aria-describedby="footnote-label">2</a></sup><span class="sidenote">Instead of stopping the alarm nothing happens and I shout variations of the command half a dozen
    times until I am finally met with blessed silence.</span> &quot;Google, play sleep.&quot;<sup class='sidenote-number'><a id="footnote-ref-3" href="#footnote-3" aria-describedby="footnote-label">3</a></sup><span class="sidenote">Instead of starting a spotify playlist of soft piano music called &quot;Sleep&quot; it tells a bedtime
    story(?) about a google assistant not realizing it was muted.</span>) now
either don&#39;t work at all or do something different than they did last week. This is frustrating and
honestly unacceptable behavior for a home appliance - would you appreciate it if your
<a href="https://arstechnica.com/gaming/2020/01/unauthorized-bread-a-near-future-tale-of-refugees-and-sinister-iot-appliances/">toaster stopped accepting unauthorized bread</a>
or a <a href="https://azhdarchid.com/are-llms-useful/">clock that was wrong 80% of the time</a>?</p>
<p>While I&#39;m not privy to the inner workings of Google&#39;s voice recognition algorithms, this mirrors the
degradation of many tools and services since the popularity boom of Large Language Models (LLMs), or
&quot;generative AI&quot;.</p>
<hr/>
<h3>Linguistic Pareidolia</h3>
<p>
        <figure>
          <span class="marginnote">from <a href="https://bsky.app/profile/joles.bsky.social/post/3logjuqggkk2q">@joles.bsky.social</a></span>
          <img src="/images/monster-voices.png" alt="null" />
        </figure></p>
<p>You&#39;ll often hear about ChatGPT (and other LLMs) &quot;hallucinating&quot; - that is, making a false claim.
This is a metaphor that serves to humanize and excuse the bot. A hallucination is a problem with
perception such as seeing or hearing things that aren&#39;t there. To say that the bot is hallucinating
(for example, when it tells you that there are
<a href="https://www.inc.com/kit-eaton/how-many-rs-in-strawberry-this-ai-cant-tell-you.html">two R's in the word strawberry</a>)
therefore, makes the claim that it:</p>
<ul>
<li>understands that you are asking a question and desiring a truthful answer</li>
<li>has a perception of the world</li>
<li>makes a mistake in answering based on that perception being inaccurate</li>
</ul>
<p>In reality, none of these are true. LLMs don&#39;t have any conception of of the truth; they don&#39;t
contain a model of the world or have a capacity to perceive it. Interacting with them usually takes
the form of a conversation, but under the hood it&#39;s more like the predictive text on your phone
keyboard - choosing the word that is statistically most likely to come next. It won&#39;t give you the
answer to your question, it will return answer-shaped text, the pink slime of information, that may
or may not happen to correspond with what you wanted to know. LLMs don&#39;t lie, they don&#39;t make
mistakes, and they certainly don&#39;t hallucinate. They speak without regard for the truth - in other
words, <a href="https://link.springer.com/article/10.1007/s10676-024-09775-5">they bullshit</a>.</p>
<p>
        <figure>
          <span class="marginnote">from <a href="https://bsky.app/profile/shutupmikeginn.bsky.social/post/3ljtahu54js27">@shutupmikeginn.bsky.social</a></span>
          <img src="/images/gpt-amnesia.png" alt="null" />
        </figure></p>
<p>So, given that LLMs are bullshit machines, why do so many people put so much faith in them?<sup class='sidenote-number'><a id="footnote-ref-8" href="#footnote-8" aria-describedby="footnote-label">4</a></sup><span class="sidenote">I use the word faith intentionally, given the
    <a href="https://www.youtube.com/watch?v=zKCynxiV_8I">number</a> of
    <a href="https://www.rollingstone.com/culture/culture-features/ai-spiritual-delusions-destroying-human-relationships-1235330175/">cults</a>
    popping up around them.</span>
Standard industry benchmarks
<a href="https://freethoughtblogs.com/atrivialknot/2024/07/16/llm-error-rates/">show error rates between 5-50%</a>.
Given that these tests are performed by the same companies developing the models I&#39;m not convinced
that
<a href="https://www.techspot.com/news/107101-new-study-finds-ai-search-tools-60-percent.html">real-world results aren't worse</a>,
but for rhetorical purposes I&#39;ll take the midpoint and assume an error rate of around 25%. The way I
see it, there are two different (but overlapping) groups of people who champion LLMs.</p>
<p>Group 1 uses LLMs as tools, such as for code generation or as a search engine. A possible
explanation for continued use despite errors is
<a href="https://silly.business/blog/gell-manns-one-armed-bandit/">Gell-Mann Amnesia</a>, the phenomenon where
a source (originally a newspaper) presents information you know to be incorrect on a topic you&#39;re
familiar with, but you continue to believe it on other topics. A professional in a given field would
be able to tell which quarter of a given response is nonsense, but to the layman it all appears
equally plausible.<sup class='sidenote-number'><a id="footnote-ref-9" href="#footnote-9" aria-describedby="footnote-label">5</a></sup><span class="sidenote">Absent an obvious error like telling you to
    <a href="https://www.theverge.com/2024/5/23/24162896/google-ai-overview-hallucinations-glue-in-pizza">glue cheese to pizza</a>.</span> This means that many of the LLM&#39;s errors will be missed, while the user feels
smart for catching one or two issues that they happened to notice.</p>
<p>Group 2 is largely a subset of group 1 which, instead of just using LLMs, believes that they are
intelligent, possibly sentient, beings. Human brains are powerful pattern matching machines, and
there&#39;s no pattern that we love to find more than ourselves. This is
<a href="https://en.wikipedia.org/wiki/Pareidolia">pareidolia</a>, most commonly thought of as perceiving faces
in random patterns such as a knobbly tree or the surface of the moon. Language seems to have just as
powerful an effect on us, with this linguistic pareidolia being similar to the
<a href="https://en.wikipedia.org/wiki/ELIZA_effect">ELIZA effect</a>, where a rudimentary chatbot from 1966 is
perceived as being intelligent and aware, even when users are aware that it was largely just
rephrasing the users inputs as questions. It&#39;s no wonder, then, that today&#39;s much more sophisticated
chatbots, capable of seemingly holding a conversation on any conceivable topic, fool people into
believing that there is a mind on the other side of the screen. This misconception is furthered by
<a href="https://softwarecrisis.dev/letters/llmentalist/">the same tools psychics use</a> to fool our brains
into believing that statistically generic statements are personally meaningful.</p>
<hr/>
<h3>Regurgitated Brains</h3>
<p>
        <figure>
          <span class="marginnote">from <a href="https://bsky.app/profile/dansheehan.bsky.social/post/3lngmmdh77k2g">@dansheehan.bsky.social</a></span>
          <img src="/images/spiritual-death.jpg" alt="null" />
        </figure></p>
<p>I didn&#39;t enjoy writing essays when I was in school. It was generally a tedious slog for me to squeak
over the minimum word or page count for an assignment, but the purpose of the essays being assigned
was clear. My professor was not in desperate need of a dozen essays discussing Borges. She wasn&#39;t
expecting us to present her with groundbreaking theories or never-before-considered ideas. The point
of the essay was for us to learn through the process of writing it.
<a href="https://nymag.com/intelligencer/article/openai-chatgpt-ai-cheating-education-college-students-school.html">Using ChatGPT to write your essays</a>
is like lifting weights at the gym with a forklift. It fundamentally misunderstands the point and
defeats the purpose.</p>
<p>Education has been trending towards diploma mills and job certifications for a long time now, but
this dispels the illusion that it&#39;s about teaching people how to think. If
<a href="https://www.404media.co/teachers-are-not-ok-ai-chatgpt/">teachers assign generated lesson plans and students return generated work</a>,
what are we even doing? You might as well drop the pretense of learning, save everyone some time,
and have recess all day. At least then the students might be enjoying themselves.</p>
<p>Even the most generous reading of using LLMs in education falls short. As noted before, all of the
output of an LLM is generally equally plausible. People are fallible, but we tend to make mistakes
in predictable ways: misremembering a date, forgetting a word, misspelling something. LLMs however,
as mentioned, will confidently spout off correct-seeming bullshit that doesn&#39;t have any of the
markers of hesitation or hedging that a real person might, which makes us more likely to believe it.
The purpose of education is to teach people things, implying they don&#39;t already know the truth. Are
students supposed to fact check every statement and implication? In that case, what is the benefit
of using the LLM instead of just teaching the correct things in the first place? This is especially
troubling given early evidence that use of LLMs
<a href="https://time.com/7295195/ai-chatgpt-google-learning-school/">lowers brain activity</a> and
<a href="https://gizmodo.com/microsoft-study-finds-relying-on-ai-kills-your-critical-thinking-skills-2000561788">degrades critical thinking skills</a>.
Even when people are aware of the problem and believe that they&#39;re being careful, it&#39;s all too easy
to let your eyes glaze over and start to
<a href="https://www.scworld.com/news/vibe-coding-using-llms-susceptible-to-most-common-security-flaws">vibe code</a>.
Partial automation in &quot;self-driving&quot; cars can be
<a href="https://spectrum.ieee.org/partial-vehicle-autonomy-risk">more dangerous</a> than no automation, since
it lulls people into a false sense of security and makes them unprepared when danger strikes.
Similarly, a mostly accurate LLM can trick you into believing falsehoods if the few points you
fact-check turn out to be correct.</p>
<hr/>
<h3>The purpose of a system is what it does.</h3>
<p>When you have a hammer, everything looks like a nail. A hammer is a very effective tool for
delivering a powerful force when swung. That can be beneficial, like when building a house or piece
of furniture. It can also lead to pain if you happen to miss the nail and hit your thumb instead.</p>
<p>When thinking about the a new technology such as the LLM, a useful tool is to examine the inputs and
outputs and see what <a href="https://en.wikipedia.org/wiki/Affordance">affordances</a> are provided. An LLM is
very good at producing large amounts of statistically plausible content very quickly. Given a brief
direction in the form of a prompt, it can pontificate on any given subject for as long as you want,
or produce hundreds of different variations on a theme. However, it is very bad at producing
<em>accurate information</em>. Therefore, it is most suited for uses focused on quantity over quality,
where speed and volume are more important than truth or accuracy.</p>
<p>The primary use cases that fit those criteria are spam, scams, and misinformation/propaganda, which
can be grouped together as <a href="https://en.wikipedia.org/wiki/AI_slop">slop</a>. The first two of these
forms of slop are fundamentally cynical plays to extract money from a system, with the primary
difference being where the money comes from. Spam posts look to extract money from platform holders
by being engaging enough (often through appeals to emotion such as fear or anger) to earn pennies of
advertising revenue, while scams seek to extract money from individuals through trickery. Spam is
more focused on large numbers of small, consistent payouts versus scams typically seeking out
&quot;whales&quot; that drop large amounts of money more infrequently. Both of these make the world worse for
everyone except the perpetrators.</p>
<p>Propaganda is somewhat different, but no better. Instead of extracting money, it can be thought of
as extracting political power by filling people&#39;s heads with the information that benefits the
people producing it - typically existing power structures and influential elites. While current
attempts at directly manipulating LLM outputs have had limited success<sup class='sidenote-number'><a id="footnote-ref-10" href="#footnote-10" aria-describedby="footnote-label">6</a></sup><span class="sidenote">xAI&#39;s Grok is the pioneer here, from
    <a href="https://www.rollingstone.com/culture/culture-news/grok-elon-musk-south-africa-white-genocide-1235339420/">talking nonstop about &quot;white genocide&quot;</a>
    to
    <a href="https://www.npr.org/2025/07/09/nx-s1-5462609/grok-elon-musk-antisemitic-racist-content">calling itself MechaHitler</a>
    to
    <a href="https://apnews.com/article/grok-4-elon-musk-xai-colossus-14d575fb490c2b679ed3111a1c83f857">searching for owner Elon Musk&#39;s views on a topic before responding</a>.</span>, bad actors
<a href="https://www.404media.co/the-ai-slop-presidency/">such as the Trump administration</a> have no issues
using existing LLM systems to generate false, misleading, or anger-inducing text and images which
can then be disseminated through more traditional means. Being unconcerned with pesky notions such
as facts or truth makes &quot;AI art&quot; perfectly suited to be the new
<a href="https://newsocialist.org.uk/transmissions/ai-the-new-aesthetics-of-fascism/">aesthetic of fascism</a>
in the current moment, similar to
<a href="https://artmejo.com/how-italian-futurism-influenced-the-rise-of-fascism/">futurism in pre-war Italy</a>
or the
<a href="https://smarthistory.org/modernisms-1900-1980/german-art-between-the-wars/nazi-visual-culture/">Nazi's fascist realism</a>.
The output of these models tends towards Thomas Kinkade-esque kitch, without the need for artists or
labor.</p>
<hr/>
<h3>Garbage In, Garbage Out</h3>
<p>
        <figure>
          <span class="marginnote">a charcoal drawing of a woman I made in a recent art class</span>
          <img src="/images/charcoal-woman.jpg" alt="null" />
        </figure></p>
<p>Art is communication. <a href="https://en.wikipedia.org/wiki/Reception_theory">Reception theory</a> claims that
an author conceives of their work, encodes it into a transmittable form<sup class='sidenote-number'><a id="footnote-ref-4" href="#footnote-4" aria-describedby="footnote-label">7</a></sup><span class="sidenote">This could be written or spoken language, images, a game, whatever.</span>, where it is then
decoded by the audience. Meaning is created between the text and the reader. A text produced by AI
removes the intention of the author from the equation. While the
<a href="https://en.wikipedia.org/wiki/The_Death_of_the_Author">death of the author</a> is often used to
analyze the meaning of a text separated from the author&#39;s intention, I argue that intentionality is
critical to the interpretation of a text, even when that intention is unknown or rejected. How can
you do a <a href="https://www.frankwbaker.com/mlc/close-reading-of-media-texts/">close reading</a> of a text
when the reason behind every decision is inevitably &quot;It was statistically probable&quot;?</p>
<p>Procedural or probabilistic art is nothing new; arguably going back to the
<a href="https://gbrachetta.github.io/Musical-Dice/">musical dice games</a><sup class='sidenote-number'><a id="footnote-ref-6" href="#footnote-6" aria-describedby="footnote-label">8</a></sup><span class="sidenote"><a href="https://en.wikipedia.org/wiki/Musikalisches_W%C3%BCrfelspiel">Musikalisches Würfelspiel</a></span> from the 18th century or the
<a href="https://aeon.co/essays/who-needs-ai-text-generation-when-theres-erasmus-of-rotterdam">Ciceronian writers of the 16th</a>,
though it grew in prominence with the advent of the computer. In those cases however, the intention
and artistry are located in the rules and structures which constrain and give shape to the result.
The closest thing a generated text has to intention is the prompt, though there&#39;s not much to
analyze<sup class='sidenote-number'><a id="footnote-ref-5" href="#footnote-5" aria-describedby="footnote-label">9</a></sup><span class="sidenote">Psychoanalyze, maybe...</span> from &quot;beautiful masterpiece, 3D animation of a girl in classroom wearing casual business
clothes, big boobs, long hair&quot;. The prompter submits that text and receives an end product without
making any additional choices throughout the creation. They may be unsatisfied with the final
result, but their only recourse is to revise the original prompt in the hopes that the next version
will be more to their liking. In this way the prompter is more akin to an art <em>commissioner</em> than an
artist.</p>
<p><a href="https://en.wikipedia.org/wiki/Sturgeon%27s_law">Sturgeon's Law</a> states that 90% of everything is
crap. We could quibble over exact percentages, but this seems pretty trivially correct, right? Maybe
I have a different opinion of which 10% is the good stuff than you do, but we both agree that the
majority of books/movies/games/programs/whatever suck. Given that the input of LLMs is
<a href="https://www.robinsloan.com/lab/is-it-okay/">Everything™</a>, that means that they&#39;re full of shit.<sup class='sidenote-number'><a id="footnote-ref-7" href="#footnote-7" aria-describedby="footnote-label">10</a></sup><span class="sidenote">In fact, I&#39;d suspect that the breadth of mediums included in Everything™ could make the output
    worse! The average book, crap though it may be, still probably has better prose than the average
    Reddit post, which in turn is better than the average tweet.</span>
There&#39;s no way (other than training a new model from scratch) to make sure that ChatGPT only uses
The Good Stuff™ when you ask it to generate the next bestseller mystery/fantasy/romance novel - what
you&#39;ll get is generic, clichéd crap.</p>
<blockquote>
<p>AI is always stunning at first encounter: one is amazed that something nonhuman can make something
that seems so similar to what humans make. But it’s a little like Samuel Johnson’s comment about a
dog walking on its hind legs: we are impressed not by the quality of the walking but by the fact
it can walk that way at all. After a short time it rapidly goes from awesome to funny to slightly
ridiculous—and then to grotesque. Does it not also matter that the walking dog has no
intentionality—doesn’t “know” what it’s doing?</p>
<p>- Brian Eno,
<a href="https://www.bostonreview.net/forum/the-ai-we-deserve/ais-walking-dog/">"AI’s Walking Dog"</a></p>
</blockquote>
<p>Sometimes &quot;AI artists&quot; will claim that they&#39;re &quot;democratizing art&quot;. This is clearly nonsense; there
is no Art King that decrees who is allowed to make art, anyone can do it. What they mean is that
they want to make (what they consider) &quot;good&quot; art, but without putting in any effort to develop
skills along the way. They want the respect and recognition of being An Artist without putting in
any of the work, and at the same time disrespecting anyone who has spent time making something. I
know the feeling of believing that your work isn&#39;t good enough to even bother trying. But I promise
that I would rather see your awkward, unsteady, <strong>human</strong> work than look at a soulless image
produced by a diffusion model. I&#39;ve been taking classes at a local art school<sup class='sidenote-number'><a id="footnote-ref-13" href="#footnote-13" aria-describedby="footnote-label">11</a></sup><span class="sidenote">Shout out to <a href="https://fleisher.org/">Fleisher Art Memorial</a>!</span>, and the process
of observing, creating, and learning means that I&#39;m making work that I&#39;m proud of, even when it
isn&#39;t as technically proficient as someone who&#39;s been drawing longer.</p>
<hr/>
<h3>Ethical Slavery</h3>
<p>
        <figure>
          <span class="marginnote"><a href="https://x.com/bumblebike/status/832394003492564993">supposedly from a 1979 internal IBM training manual</a></span>
          <img src="/images/a-computer-can-never-be-held-accountable.jpg" alt="null" />
        </figure></p>
<p>I&#39;m gonna focus on software development because that&#39;s my field, and it&#39;s the area where the largest
benefit to using LLM assistance is claimed. Many times I&#39;ve seen someone say:</p>
<blockquote>
<p>Sure, the theft is bad, the art is bad, the environmental impacts are bad. But it&#39;s really good at
writing code!</p>
</blockquote>
<p>That&#39;s a nice idea, but does the data back it up? Early reports say...
<a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/">no</a>. In fact...</p>
<blockquote>
<p>When developers are allowed to use AI tools, they take 19% longer to complete issues—a significant
slowdown that goes against developer beliefs and expert forecasts. This gap between perception and
reality is striking: developers expected AI to speed them up by 24%, and even after experiencing
the slowdown, they still believed AI had sped them up by 20%.</p>
</blockquote>
<p>Pretty damning. But that&#39;s also surprising - it&#39;s well known that scoping work is one of the hardest
problems in computer science<sup class='sidenote-number'><a id="footnote-ref-11" href="#footnote-11" aria-describedby="footnote-label">12</a></sup><span class="sidenote">The other 3 are naming things and off by one errors.</span>, but why do the developers still believe that using the LLM sped
them up afterwards? It goes back to the
<a href="https://www.baldurbjarnason.com/2025/trusting-your-own-judgement-on-ai/">psychic's con</a>. There are
a lot of people, especially in tech, who have vested interests in LLMs being useful. Like
homeopathy, self-experimentation and lack of controlled experiments makes it very easy to convince
yourself that it helped you recover from that cold/push that PR faster.</p>
<p>LLMs are very good at producing large quantities of code quickly. But the difficult part of
programming has never been the typing, it&#39;s the thinking: figuring out what problem you&#39;re trying to
solve, what the correct behavior should be, and how to implement it. And that&#39;s work that you can&#39;t
skip. When you try, you might end up with a result that looks correct at a glance, but closer
examination is likely to reveal critical flaws and vulnerabilities. More importantly, skipping the
thought means missing out on the opportunities to learn something new and maybe even figure out that
you weren&#39;t solving the correct problem in the first place.</p>
<p>People objecting to new technologies are sometimes called luddites, technophobes, people who just
hate progress! But the <a href="https://thenib.com/im-a-luddite/">original Luddites</a> were skilled textile
workers, and not opposed to new technology. Their problem was with the capitalists using those new
machines to drive down wages, lower product quality, and increase control. (Sound familiar?) When
the workers resisted this through collective action and sabotage, soldiers were sent in to
<a href="https://www.theguardian.com/australia-news/commentisfree/2025/jul/01/ai-hype-artificial-intelligence-power-dynamics">execute and deport workers</a>.
Similarly, LLM use is being
<a href="https://www.windowscentral.com/microsoft/using-ai-is-no-longer-optional-did-microsoft-makes-copilot-mandatory-for-staff">mandated</a>
<a href="https://www.bloodinthemachine.com/p/how-big-tech-is-force-feeding-us">by capital</a> from the
<a href="https://www.axios.com/2025/03/18/enterprise-ai-tension-workers-execs">top down</a>. It&#39;s being use to
<a href="https://www.cnbc.com/2025/05/14/klarna-ceo-says-ai-helped-company-shrink-workforce-by-40percent.html">replace workers</a>
despite
<a href="https://www.customerexperiencedive.com/news/klarna-reinvests-human-talent-customer-service-AI-chatbot/747586/">lower quality work</a>.</p>
<p>One of the main goals of the current LLM push is to replace workers. By examining the affect of
chatbots currently on the market you can see what the ideal worker is, according to the executives
pushing this technology. The perfect worker is servile and will never tell you no. The perfect
worker produces correct-seeming results quickly, but the actual
<a href="https://www.npr.org/2025/05/20/nx-s1-5405022/fake-summer-reading-list-ai">accuracy and quality of the results is less important</a>
than whether they&#39;re <a href="https://productpicnic.beehiiv.com/p/ai-saved-the-feature-factory">good enough</a>
to pass along to the next sucker. The perfect worker is sycophantic and will agree with you, no
matter what you say. It&#39;s no wonder LLMs are such a hit with the
<a href="https://www.wheresyoured.at/the-era-of-the-business-idiot/">Business Idiots</a> of the world. They
satisfy the desire for a slave that you don&#39;t even have to feel bad about owning. This desire has
been part of the dream of intelligent machines since at least
<a href="https://thereader.mitpress.mit.edu/origin-word-robot-rur/">1920 and the play R.U.R.</a> (Rossum&#39;s
Universal Robots), which is the originator of the word &quot;robot&quot;. The Star Trek TNG episode
<a href="https://en.wikipedia.org/wiki/The_Measure_of_a_Man_(Star_Trek:_The_Next_Generation)">"The Measure of a Man”</a>
deals with this same issue, whether Commander Data is a person or property. Current LLMs are not
sentient, and I highly doubt that this approach could ever create a true artificial mind. But
creating servile &quot;assistants&quot; that will do whatever you ask causes real harm today, even if they
don&#39;t have feelings. <a href="https://every.to/also-true-for-humans/mon-6-24">Threatening an LLM</a> to try and
produce better outputs is morally corrupting, and can predispose you to act similarly to real
people. The belief that LLMs are capable of outperforming human workers has led to layoffs, and the
remaining employees are expected to do more with less because of the &quot;AI assistance&quot;.</p>
<hr/>
<p>This post doesn&#39;t cover all of the problems I see arising from LLMs<sup class='sidenote-number'><a id="footnote-ref-12" href="#footnote-12" aria-describedby="footnote-label">13</a></sup><span class="sidenote">I haven&#39;t even mentioned the
    <a href="https://www.technologyreview.com/2025/05/20/1116327/ai-energy-usage-climate-footprint-big-tech/">climate concerns</a>,
    <a href="https://www.theguardian.com/technology/2025/apr/24/elon-musk-xai-memphis">environmental pollution</a>,
    or
    <a href="https://www.reuters.com/technology/meta-used-copyrighted-books-ai-training-despite-its-own-lawyers-warnings-authors-2023-12-12/">rampant theft</a>.</span>, and many of them could
apply to other parts of the modern tech industry. The last few fads that have swept through
(cryptocurrency, the metaverse, NFTs) have all had a similar feeling to them; a hint of possibility
buried under a mountain of scams, lies, and desperation. The zero interest-rate policy and
free-flowing venture capital of the 2010s propped up massive valuations without the need for actual
results, but now the music&#39;s stopped and everyone&#39;s racing to find a seat. The underlying machine
learning transformer models of LLMs will, no doubt, find use cases. But this isn&#39;t it. This is
<a href="https://olu.online/monotony/">boring</a>.
<a href="https://eev.ee/blog/2025/07/03/the-rise-of-whatever/">Whatever</a>.
<a href="https://dansinker.com/posts/2025-05-23-who-cares/">Who Cares</a>.</p>
<h2>Further Reading</h2>
<ul>
<li><a href="https://bsky.app/profile/jakemgrumbach.bsky.social/post/3lolsx6kib22z">(Post) Humanism, not cynicism</a></li>
<li><a href="https://arstechnica.com/ai/2024/10/hospitals-adopt-error-prone-ai-transcription-tools-despite-warnings/">(Article) Hospitals adopt error-prone AI transcription tools despite warnings</a></li>
<li><a href="https://www.teenvogue.com/story/chatgpt-is-everywhere-environmental-costs-oped">(Article) ChatGPT Is Everywhere — Why Aren't We Talking About Its Environmental Costs?</a></li>
<li><a href="https://pluralistic.net/2025/04/27/some-animals/#are-more-equal-than-others">(Blog) The enshittification of tech jobs</a></li>
<li><a href="https://www.kardome.com/blog-posts/seamless-voice-interaction-experience">(Blog) The main hurdle on our way towards a seamless voice interaction experience</a></li>
<li><a href="https://docseuss.medium.com/copyright-rules-ai-drools-and-plagiarism-is-for-suckers-who-have-no-soul-0b3c74eba0a8">(Blog) copyright rules, ai drools, and plagiarism is for suckers who have no soul</a></li>
<li><a href="https://www.newyorker.com/culture/the-weekend-essay/my-brain-finally-broke">(Article) My Brain Finally Broke</a></li>
<li><a href="https://whateverthewindbrings.com/the-so-called-ai-is-not-intelligent/">(Blog) The so-called "AI" is not intelligent</a></li>
<li><a href="https://blog.glyph.im/2025/06/i-think-im-done-thinking-about-genai-for-now.html">(Blog) I Think I’m Done Thinking About genAI For Now</a></li>
<li><a href="https://marshallbrain.com/manna">(Story) Manna – Two Views of Humanity’s Future</a></li>
<li><a href="https://limitesnumeriques.fr/travaux-productions/ai-forcing/en">(Paper) How tech companies are pushing us to use AI</a></li>
<li><a href="https://softwarecrisis.dev/letters/ai-and-software-quality/">(Blog) Modern software quality, or why I think using language models for programming is a bad idea</a></li>
</ul>
<hr/>
<hr />
<section class="footnotes" >
<h2 id="footnote-label" class="hidden">Footnotes</h2>
<ol>
<li id="footnote-1">
<p>Could&#39;ve sworn it was called a Google Home but apparently not. <a href="#footnote-ref-1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="footnote-2">
<p>Instead of stopping the alarm nothing happens and I shout variations of the command half a dozen
times until I am finally met with blessed silence. <a href="#footnote-ref-2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="footnote-3">
<p>Instead of starting a spotify playlist of soft piano music called &quot;Sleep&quot; it tells a bedtime
story(?) about a google assistant not realizing it was muted. <a href="#footnote-ref-3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="footnote-8">
<p>I use the word faith intentionally, given the
<a href="https://www.youtube.com/watch?v=zKCynxiV_8I">number</a> of
<a href="https://www.rollingstone.com/culture/culture-features/ai-spiritual-delusions-destroying-human-relationships-1235330175/">cults</a>
popping up around them. <a href="#footnote-ref-8" aria-label="Back to reference 8">↩</a></p>
</li>
<li id="footnote-9">
<p>Absent an obvious error like telling you to
<a href="https://www.theverge.com/2024/5/23/24162896/google-ai-overview-hallucinations-glue-in-pizza">glue cheese to pizza</a>. <a href="#footnote-ref-9" aria-label="Back to reference 9">↩</a></p>
</li>
<li id="footnote-10">
<p>xAI&#39;s Grok is the pioneer here, from
<a href="https://www.rollingstone.com/culture/culture-news/grok-elon-musk-south-africa-white-genocide-1235339420/">talking nonstop about "white genocide"</a>
to
<a href="https://www.npr.org/2025/07/09/nx-s1-5462609/grok-elon-musk-antisemitic-racist-content">calling itself MechaHitler</a>
to
<a href="https://apnews.com/article/grok-4-elon-musk-xai-colossus-14d575fb490c2b679ed3111a1c83f857">searching for owner Elon Musk's views on a topic before responding</a>. <a href="#footnote-ref-10" aria-label="Back to reference 10">↩</a></p>
</li>
<li id="footnote-4">
<p>This could be written or spoken language, images, a game, whatever. <a href="#footnote-ref-4" aria-label="Back to reference 4">↩</a></p>
</li>
<li id="footnote-6">
<p><a href="https://en.wikipedia.org/wiki/Musikalisches_W%C3%BCrfelspiel">Musikalisches Würfelspiel</a> <a href="#footnote-ref-6" aria-label="Back to reference 6">↩</a></p>
</li>
<li id="footnote-5">
<p>Psychoanalyze, maybe... <a href="#footnote-ref-5" aria-label="Back to reference 5">↩</a></p>
</li>
<li id="footnote-7">
<p>In fact, I&#39;d suspect that the breadth of mediums included in Everything™ could make the output
worse! The average book, crap though it may be, still probably has better prose than the average
Reddit post, which in turn is better than the average tweet. <a href="#footnote-ref-7" aria-label="Back to reference 7">↩</a></p>
</li>
<li id="footnote-13">
<p>Shout out to <a href="https://fleisher.org/">Fleisher Art Memorial</a>! <a href="#footnote-ref-13" aria-label="Back to reference 13">↩</a></p>
</li>
<li id="footnote-11">
<p>The other 3 are naming things and off by one errors. <a href="#footnote-ref-11" aria-label="Back to reference 11">↩</a></p>
</li>
<li id="footnote-12">
<p>I haven&#39;t even mentioned the
<a href="https://www.technologyreview.com/2025/05/20/1116327/ai-energy-usage-climate-footprint-big-tech/">climate concerns</a>,
<a href="https://www.theguardian.com/technology/2025/apr/24/elon-musk-xai-memphis">environmental pollution</a>,
or
<a href="https://www.reuters.com/technology/meta-used-copyrighted-books-ai-training-despite-its-own-lawyers-warnings-authors-2023-12-12/">rampant theft</a>. <a href="#footnote-ref-12" aria-label="Back to reference 12">↩</a></p>
</li>
</ol>
</section>

          </div>
        </content>
      </entry>
      <entry>
        <id>https://www.fauxtrots.com/blog/automated-timestamps</id>
        <title>Automating blog post timestamps</title>
        <link href="https://www.fauxtrots.com/blog/automated-timestamps" />
        <summary>A regex journey</summary>
        <updated>5/28/2025</updated>
        <content type="xhtml">
          <div xmlns="http://www.w3.org/1999/xhtml">
<p>I&#39;ve been laying down the tracks on this blog as it&#39;s rolling along, so I thought I&#39;d write up a
little improvement I made recently. This will also serve as it&#39;s first real test, so fingers crossed
that it actually works and doesn&#39;t produce an embarrassing mistake.</p>
<p>Like pretty much any blog, my posts are dated. However, previously those dates were hand entered by
me as I wrote the markdown files. That left the annoyingly likely possibility that a typo or
forgetting to update the frontmatter would leave me with posts time traveling from the past or
future. It was also highly imprecise - only recording the date. While it&#39;s unlikely that I&#39;ll ever
post anything where precise timestamps are required, it still bugged me. Being of a technical
nature, I decided to automate this, and learned something along the way!</p>
<p>Since my blog is hosted as a GitHub repo, I decided to try and hook this into the git commit
process. I already had <a href="https://pre-commit.com/">pre-commit</a> set up with a hook that strips metadata
from pictures<sup class='sidenote-number'><a id="footnote-ref-1" href="#footnote-1" aria-describedby="footnote-label">1</a></sup><span class="sidenote">So I don&#39;t dox myself.</span> with <a href="https://exiftool.org/">exiftool</a>, so that seemed like the right place to
start. Here&#39;s my final <code>.pre-commit-config.yaml</code> file:</p>
<pre><code class="language-yaml">repos:
	- repo: local
	hooks:
	- id: no-spicy-exif
		name: Ban spicy exif data
		description: Ensures that there is no sensitive exif data committed
		language: system
		entry: exiftool -all= --icc_profile:all -tagsfromfile @ -orientation -overwrite_original
		exclude_types: [&#39;svg&#39;]
		types: [&#39;image&#39;]
	- id: timestamp-posts
		name: Add createdAt and modifiedAt timestamps to posts automatically
		types: [&#39;file&#39;, &#39;markdown&#39;]
		language: script
		entry: ./timestamp.sh
</code></pre>
<p>The way it works is that if there are any markdown files in the git diff, it runs the script
<code>timestamp.sh</code>. What&#39;s <code>timestamp.sh</code>?</p>
<pre><code class="language-perl">#!/usr/bin/perl
# this is a pre-commit hook for setting a timestamp
# in the frontmatter of markdown files
my $date = time();
my @files = `git diff-index --cached --name-only HEAD`;
foreach (@files) {
    if (/\.md$/) {
      open FILE, $_ or die $!;
      my @lines = &lt;FILE&gt;;
      close FILE or die $!;
      my $file = join(&#39;&#39;, @lines);
      if ($file =~ m/---\n(.*?)---\n(.*)/s) {
        my $frontmatter = $1;
        my $body = $2;
        if (!($frontmatter =~ /^createdAt: .*$/m)) {
          $frontmatter = $frontmatter . &quot;createdAt: $date\n&quot;;
        } elsif (!($frontmatter =~ s/^modifiedAt: .*$/modifiedAt: $date/m)) {
          $frontmatter = $frontmatter . &quot;modifiedAt: $date\n&quot;;
        }
        open FILE, &quot;&gt;$_&quot; or die $!;
        print FILE &quot;---\n$frontmatter---\n$body&quot;;
        close FILE or die $!;
        system &quot;git add $_&quot;;
      }
    }
}
</code></pre>
<p>There you go, easy! Well, maybe if you know perl. I... don&#39;t. The last time I touched perl scripts
would have to be over a decade ago in high school, and I didn&#39;t do much with it then. This script
was <strong>heavily</strong> based on a
<a href="https://gist.github.com/bensteinberg/1359f6da5e182dacd1de358737524bc4">gist by bensteinberg</a> I
found from a quick search. However, there were some changes I wanted to make, which meant I needed
to dust off those skills and dive in.</p>
<p>The first couple of lines are pretty simple, just defining some variables. I store a unix
timestamp<sup class='sidenote-number'><a id="footnote-ref-2" href="#footnote-2" aria-describedby="footnote-label">2</a></sup><span class="sidenote"><code>my $date = time();</code></span> and the array of changed files<sup class='sidenote-number'><a id="footnote-ref-3" href="#footnote-3" aria-describedby="footnote-label">3</a></sup><span class="sidenote"><code>my @files = `git diff-index --cached --name-only HEAD`​</code></span>. From there we loop over each of those files and
check whether they&#39;re markdown files. If not we move onto the next item in the array, if so we
continue. There are a couple of lines of file manipulation that I don&#39;t fully understand the syntax
of, but they work so it&#39;s fine.<sup class='sidenote-number'><a id="footnote-ref-4" href="#footnote-4" aria-describedby="footnote-label">4</a></sup><span class="sidenote">Side note, I love the <code>or die</code> syntax for crashing if an operation fails and that should be
    universal. Maybe an alternative could be <code>then perish</code>.</span></p>
<p>After that we enter into the <strong>regex zone</strong>. This was the trickiest part of the script for me. I&#39;m
familiar enough with regex, but the perl-specific tricks (like <code>​=~</code> checking for matches) gave me
some trouble to figure out. First we&#39;re checking whether the markdown file has frontmatter<sup class='sidenote-number'><a id="footnote-ref-5" href="#footnote-5" aria-describedby="footnote-label">5</a></sup><span class="sidenote">A block at the beginning of the file surrounded by <code>---</code>.</span> and
extracting it if so. Then we check whether it already has a <code>createdAt</code> timestamp, and if not we add
one by concatenating it to the frontmatter string.<sup class='sidenote-number'><a id="footnote-ref-6" href="#footnote-6" aria-describedby="footnote-label">6</a></sup><span class="sidenote"><code>    if (!($frontmatter =~ /^createdAt: .*$/m)) {       $frontmatter = $frontmatter . &quot;createdAt: $date\n&quot;;     }    </code></span> If it <em>does</em> already have a <code>createdAt</code>
property then we move on to checking whether it has the <code>modifiedAt</code> property. This was the most
confusing step for me, so I&#39;m gonna break it down.</p>
<pre><code class="language-perl">} elsif (!($frontmatter =~ s/^modifiedAt: .*$/modifiedAt: $date/m)) {
  $frontmatter = $frontmatter . &quot;modifiedAt: $date\n&quot;;
}
</code></pre>
<p>This is saying that if <code>$frontmatter</code> does <em>not</em> contain a match for that regex, then we add the
<code>modifiedAt</code> property to the end. But what&#39;s that regex doing?</p>
<pre><code class="language-perl">s/^modifiedAt: .*$/modifiedAt: $date/m
</code></pre>
<p>Starting from the beginning, the <code>s</code> before the slash means that we&#39;re performing a
find-and-replace. The first match of <code>^modifiedAt: .*$</code> will be replaced by <code>modifiedAt: $date</code>. The
search pattern starts with a caret (<code>^</code>) and ends with a <code>$</code>, which means that the contained pattern
must start and end the string being tested, in this case <code>$frontmatter</code>. Naively this might seem to
only occur if &quot;modifiedAt: ...&quot; were the only entry in the frontmatter, but the <code>m</code> at the end of
the whole expression means that each line is tested individually! So putting it all together, this
regex tests whether a <code>modifiedAt</code> property is present, and if so it gets updated to <code>$date</code>, the
current<sup class='sidenote-number'><a id="footnote-ref-7" href="#footnote-7" aria-describedby="footnote-label">7</a></sup><span class="sidenote">I guess potentially very slightly past, depending on your execution speed.</span> unix timestamp. The fact that that replacement happens <em>inside</em> the conditional
surprised me to begin with, and honestly it&#39;s still a bit unintuitive, but I appreciate the
conciseness.</p>
<p>Once that&#39;s done all that&#39;s left is cleanup. We open the file, replace its contents with our new
updated ones, and <code>git add</code> our changes so they are included in our still-in-progress commit. And
that&#39;s it! I&#39;m sure there are improvements that could be made - for one thing, I think that the
script gets called for <em>every</em> markdown file included in the diff, which means that if I try to add
two posts at once that they might both get <code>createdAt</code> tags when the script is run for the first
time, and then both get near <code>modifiedAt</code> timestamps when it gets run again. I&#39;m not so prolific a
writer that I expect to publish multiple blog posts at once, but if anyone sees an easy fix please
write in! I&#39;m glad that I was able to see a problem, fix it, and learn something from the process
all at once.</p>
<p><em>Update: <a href="/blog/link-timestamps">This post got a sequel!</a> It&#39;s about adding timestamps to the links
page and the hubris of document parsing.</em></p>
<hr />
<section class="footnotes" >
<h2 id="footnote-label" class="hidden">Footnotes</h2>
<ol>
<li id="footnote-1">
<p>So I don&#39;t dox myself. <a href="#footnote-ref-1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="footnote-2">
<p><code>my $date = time();</code> <a href="#footnote-ref-2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="footnote-3">
<p><code>my @files = `git diff-index --cached --name-only HEAD`​</code> <a href="#footnote-ref-3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="footnote-4">
<p>Side note, I love the <code>or die</code> syntax for crashing if an operation fails and that should be
universal. Maybe an alternative could be <code>then perish</code>. <a href="#footnote-ref-4" aria-label="Back to reference 4">↩</a></p>
</li>
<li id="footnote-5">
<p>A block at the beginning of the file surrounded by <code>---</code>. <a href="#footnote-ref-5" aria-label="Back to reference 5">↩</a></p>
</li>
<li id="footnote-6">
<pre><code>if (!($frontmatter =~ /^createdAt: .*$/m)) {
  $frontmatter = $frontmatter . &quot;createdAt: $date\n&quot;;
}
</code></pre> <a href="#footnote-ref-6" aria-label="Back to reference 6">↩</a>
</li>
<li id="footnote-7">
<p>I guess potentially very slightly past, depending on your execution speed. <a href="#footnote-ref-7" aria-label="Back to reference 7">↩</a></p>
</li>
</ol>
</section>

          </div>
        </content>
      </entry>
      <entry>
        <id>https://www.fauxtrots.com/blog/basement-response</id>
        <title>Response to Basement Fiction email</title>
        <link href="https://www.fauxtrots.com/blog/basement-response" />
        <summary>undefined</summary>
        <updated>5/24/2025</updated>
        <content type="xhtml">
          <div xmlns="http://www.w3.org/1999/xhtml">
<div class="author">hnkstf</div>

<blockquote>
<p>Hi Emily,</p>
<p>imagine me making many air quotes and speaking too fast: Thanks for sharing the the „Dorley
Sisters“. Another argument for the origin of „basement fiction“ or „basement literature“ as genre
is the „Fritzl case“¹ where a father held his daughter captive for 24 years. The „Dorley basement“
turns things „upside down“, men are „held below and kept in the dark“.</p>
<p>In „Silo“ the basement is a shelter, same with „A quiet place“². The scary is leaving the shelter
(like Christine³ avoiding going out, leaving Dorley Hall, during the first chapters).</p>
<p>One of my favourite terms is „chthonic“ as in „below ground“. Like in „The Descent (2004)“⁴. Also,
„underground“ associates with unconscious and uncontrollable. Also „Hell“ as religious concept, or
dark and less known places like the dark woods or a dungeon. Also isolation and
metamorphosis/transformation as in „Alice in Wonderland“, „Beauty and the Beast“, „Jekyll and
Hyde“ or „Orlando“ from Virgina Wulf. Kafka and Ovid used such themes that resonate with us since
like forever.</p>
<p>I hope this message finds you well and I was able to support your argument that „The Sisters of
Dorley“ is kind of „basement literature“ and shares more themes or tropes with „Silo“ like
isolation and segregation without using a pandemic or plague⁵ like theme.</p>
<p>Usual trigger and spoiler warnings apply:</p>
<p>¹ <a href="https://en.wikipedia.org/wiki/Fritzl_case">https://en.wikipedia.org/wiki/Fritzl_case</a></p>
<p>² <a href="https://en.wikipedia.org/wiki/A_Quiet_Place">https://en.wikipedia.org/wiki/A_Quiet_Place</a></p>
<p>³ <a href="https://www.dorley.wiki/wiki/Christine">https://www.dorley.wiki/wiki/Christine</a></p>
<p>⁴ <a href="https://en.wikipedia.org/wiki/The_Descent">https://en.wikipedia.org/wiki/The_Descent</a></p>
<p>⁵ <a href="https://en.wikipedia.org/wiki/Plague_(disambiguation)">https://en.wikipedia.org/wiki/Plague_(disambiguation)</a></p>
</blockquote>
<hr/>
<p>Thanks for reaching out! I&#39;m so glad that <a href="/blog/basement-fiction">something I wrote</a> resonated
enough for you to send an email.</p>
<p>Wow, you&#39;re not kidding on the trigger warnings for the Fritzl case. That&#39;s dark. (cw: rape, incest,
imprisonment, etc)</p>
<p>I think you&#39;re onto something about there being fear/danger about leaving the basement! Elsewhere in
Dorley characters have panic attacks when they leave the basement/hall for the first time. That&#39;s a
parallel to the real life experiences of trans women being afraid to venture out en femme early in
transition, as well as to the fear of infection that many people felt in 2020 (and that disabled
people feel to this day because people stopped masking), and the fear of anyone targeted by a
fascist regime. It&#39;s a fear and (justified) paranoia that the world is out to get you.</p>
<p>Feel free to <a href="mailto:hello@fauxtrots.com">get in touch via email</a> or write a comment at
the bottom of the page, I love hearing from people!</p>

          </div>
        </content>
      </entry>
      <entry>
        <id>https://www.fauxtrots.com/blog/tipping-point</id>
        <title>The Tipping Point</title>
        <link href="https://www.fauxtrots.com/blog/tipping-point" />
        <summary>What comes next?</summary>
        <updated>4/12/2025</updated>
        <content type="xhtml">
          <div xmlns="http://www.w3.org/1999/xhtml">
<p>We all feel it. The United States (and therefore the world, like it or not) is at a tipping point. A
crossroads. A fork in the river. Whatever metaphor you prefer, it&#39;s clear that this is A Moment
where change is possible.</p>
<blockquote>
<p>There are years, centuries, in which nothing happens, and there are days [...] into which a whole
lifetime is compressed.</p>
</blockquote>
<p>- Adriaan Schade van Westrum</p>
<p>I dont know what&#39;s going to happen next; I dont think anyone does.<sup class='sidenote-number'><a id="footnote-ref-1" href="#footnote-1" aria-describedby="footnote-label">1</a></sup><span class="sidenote">If you think that you do, congratulations on your upcoming illustrious career as a stock trader.
    No spoilers!</span> All I <em>do</em> know is that
things are going to get worse before they might get better, especially for vulnerable populations
like immigrants, disabled people, and trans people. Luckily us <em>normal</em> people dont have to worr- aw
shit, I&#39;m a trans people aren&#39;t I.</p>
<p>I&#39;m scared. I have some savings, an escape plan, and people who support me, but none of that makes
it easier, not really. Not when I&#39;m constantly alert with my head on a swivel<sup class='sidenote-number'><a id="footnote-ref-2" href="#footnote-2" aria-describedby="footnote-label">2</a></sup><span class="sidenote">And spending too much time on social media doesn&#39;t help.</span>, wondering if
today is going to be the day I need to grab everything and go.</p>
<p>But the fascists haven&#39;t won yet. They&#39;re ascendant, and all of our &quot;elites&quot; and &quot;institutions&quot; have
failed us, but (for my own sanity) I have to believe that the people are against them. Our strength
is greatest when we work together and are in community with each other. I have been to two
protests<sup class='sidenote-number'><a id="footnote-ref-3" href="#footnote-3" aria-describedby="footnote-label">3</a></sup><span class="sidenote">The latest being against PA trying to gut SEPTA funding. Trans for trains!</span> in the last two weeks, and they have both inspired me. But I also went to a friend&#39;s
block party, shared a cake I made with my new neighbor, and got permission to distribute zines at my
local coffee shop. The thing about a tipping point is that it&#39;s a moment of leverage for everyone,
including us as leftists.<sup class='sidenote-number'><a id="footnote-ref-4" href="#footnote-4" aria-describedby="footnote-label">4</a></sup><span class="sidenote">I&#39;m assuming you&#39;re a leftist because, y&#39;know, you&#39;re on my blog. If that&#39;s not how you
    identify, then maybe think about that. In times like this there are only fascists and
    antifascists, and the most dedicated antifascists are communists.</span> Opportunities for real change appear during crises, we just need to
have the wisdom to see them and the courage to seize them.</p>
<p>When we fight, we win. Trans lives matter. Solidarity forever.</p>
<hr />
<section class="footnotes" >
<h2 id="footnote-label" class="hidden">Footnotes</h2>
<ol>
<li id="footnote-1">
<p>If you think that you do, congratulations on your upcoming illustrious career as a stock trader.
No spoilers! <a href="#footnote-ref-1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="footnote-2">
<p>And spending too much time on social media doesn&#39;t help. <a href="#footnote-ref-2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="footnote-3">
<p>The latest being against PA trying to gut SEPTA funding. Trans for trains! <a href="#footnote-ref-3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="footnote-4">
<p>I&#39;m assuming you&#39;re a leftist because, y&#39;know, you&#39;re on my blog. If that&#39;s not how you
identify, then maybe think about that. In times like this there are only fascists and
antifascists, and the most dedicated antifascists are communists. <a href="#footnote-ref-4" aria-label="Back to reference 4">↩</a></p>
</li>
</ol>
</section>

          </div>
        </content>
      </entry>
      <entry>
        <id>https://www.fauxtrots.com/blog/basement-fiction</id>
        <title>Sisters of Dorley and the Rise of Basement Fiction</title>
        <link href="https://www.fauxtrots.com/blog/basement-fiction" />
        <summary>There is the you that remains that remains and remains.</summary>
        <updated>3/4/2025</updated>
        <content type="xhtml">
          <div xmlns="http://www.w3.org/1999/xhtml">
<p><em>Spoilers for <a href="https://neemtreepress.com/book/welcome-to-dorley-hall/">Welcome to Dorley Hall</a><sup class='sidenote-number'><a id="footnote-ref-1" href="#footnote-1" aria-describedby="footnote-label">1</a></sup><span class="sidenote">The Sisters of Dorley is also serially published online:
    <a href="https://archiveofourown.org/works/35394595/chapters/88223581">https://archiveofourown.org/works/35394595/chapters/88223581</a></span>,
<a href="https://tv.apple.com/us/show/severance/umc.cmc.1srk2goyh2q2zdxcx605w8vtx">Severance</a> season 1, and
up to chapter 5 of <a href="https://www.sunsetvisitor.studio/">1000xRESIST</a></em></p>
<blockquote>
<p><em>There is a star and a star and a dangerous gravity.</em></p>
</blockquote>
<p>There&#39;s a seductive appeal to masculinity. It promises power, respect, love - all you have to do is
follow the rules. Enforce the structure of the patriarchy both within and without. However, like
many seductive forces, it seeks to corrupt the user. When it is allowed to, masculinity will curdle.
Rot. Eat away at them and anyone unlucky enough to be nearby. What can be done about it?</p>
<p>
        <figure>
          <span class="marginnote"></span>
          <img src="/images/psychic-damage.jpg" alt="null" />
        </figure></p>
<blockquote>
<p><em>There is a you and an us and a means to us.</em></p>
</blockquote>
<p>Enter the Basement. Physically and/or socially violent young men are brought to it against their
will. Stripped of outside influences that reinforce masculinity and punish deviations from it. They
are faced with what they have done, how they have harmed themselves and others around them, often
the very people they claim to love. And they are (eventually) given a choice - rid themselves of
masculinity or wash out. The details of washing out, of failing to complete the program, are never
explicitly stated, but the path to graduation is - become a woman. What&#39;s more, the women running
the program were once boys in the same position, now graduated and continuing the cycle.</p>
<blockquote>
<p><em>But there is a nothing and it is not you and nothing lasts forever.</em></p>
</blockquote>
<p>Understandably, this is difficult for the boys to learn. They cling to their masculinity like a
piece of driftwood in the middle of the ocean. The sponsors have the job of prying their fingers
off, one by one, until they learn to swim. Of surgically cutting it out of their psyche bit by bit.
But the goal isn&#39;t to torture, or punish, or even redeem.</p>
<blockquote>
<p><em>There is a decoupling of substance and a dangerous gravity.</em></p>
</blockquote>
<p>The goal is to make people out of bastards, to remove the excuses and justifications for hurting
people, and the official stance of the program is that reform can&#39;t happen without removing the
masculinity that is the source of the problem in the first place. Even if you accept that as true
though, you&#39;re forced to grapple with that questionable-at-best morality while faced with the
undeniable truth - that the program works.<sup class='sidenote-number'><a id="footnote-ref-2" href="#footnote-2" aria-describedby="footnote-label">2</a></sup><span class="sidenote">Mandatory disclaimer: The program works within the story. I am not proposing the construction of
    forcefem torture basements.</span> All of the graduates of Dorley Hall that we see in
the book end up as better and happier people. And so the cycle continues.</p>
<hr/>
<p>Dorley Hall hosts the prime example, but once I started looking I saw the Basement in many of my
favorite works from recent years. Let&#39;s lay out some parameters for what qualifies a work as a piece
of Basement Fiction. First and foremost, the basement is underground. Characters are stuck inside
the basement, wanting to escape. Finally, it seems that the basement is cyclical in nature.</p>
<p>In Severance, people&#39;s brains are split in two, with the &quot;innie&quot; only existing at work and the
&quot;outie&quot; inhabiting the body during the rest of the day. Neither half has memories of the other,
meaning that innies know nothing of their past or the world outside their labyrinthine basement
office. One memorable scene in an early episode shows Helly, a new innie, repeatedly try to leave
the office only for her outie to walk right back in. She (as with all new employees) is guided
through coming into existence by another innie, then quickly put to work. At the end of the day they
all pack up and leave, only to regain consciousness at the start of the next workday.</p>
<p>1000xRESIST depicts a society of clones living deep below the surface in the Orchard (our
metaphorical basement). The clones (referred to as sisters) are birthed, work, and pass on. 1000
years of this have gone by, clones raising clones raising clones, all watched over by their leader
named Principal in the name of Iris, the ALLMOTHER (their immortal progenitor). Over the course of
the first half of the game we learn how Principal has lied to and manipulated their entire society,
culminating in the discovery that Principal is part of the first generation of clones and was
controlled and traumatized directly by Iris. In turn, we witness memories of Iris being judged and
controlled by her mother, and her mother being controlled by hers. The cycles of abuse have built
up, trapped in a pressure cooker underground for a millennia.</p>
<p>What is it about the current moment that has our culture fixated on the Basement? My best guess is
that it&#39;s a reaction to the early days of COVID. For a few months many people were afraid to leave
their homes, with every day feeling much like the last. They may not have literally been trapped in
a basement, but in some ways that would be a more comforting explanation for their isolation and
confinement. I&#39;m curious whether this trend will continue, and I&#39;m sure that there are other works
that I&#39;ve missed.<sup class='sidenote-number'><a id="footnote-ref-3" href="#footnote-3" aria-describedby="footnote-label">3</a></sup><span class="sidenote">Honorable mention to Silo, which was written well before COVID but was since made into a TV
    series. I enjoy the show but couldn&#39;t make it work for my argument.</span> Either way it&#39;s produced great art across multiple different mediums, so I&#39;m
hopeful that we&#39;ll continue exploring the Basement for while yet.</p>
<hr />
<section class="footnotes" >
<h2 id="footnote-label" class="hidden">Footnotes</h2>
<ol>
<li id="footnote-1">
<p>The Sisters of Dorley is also serially published online:
<a href="https://archiveofourown.org/works/35394595/chapters/88223581">https://archiveofourown.org/works/35394595/chapters/88223581</a> <a href="#footnote-ref-1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="footnote-2">
<p>Mandatory disclaimer: The program works within the story. I am not proposing the construction of
forcefem torture basements. <a href="#footnote-ref-2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="footnote-3">
<p>Honorable mention to Silo, which was written well before COVID but was since made into a TV
series. I enjoy the show but couldn&#39;t make it work for my argument. <a href="#footnote-ref-3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section>

          </div>
        </content>
      </entry>
</feed>