<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en_GB"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://canmom.art/feed.xml" rel="self" type="application/atom+xml" /><link href="https://canmom.art/" rel="alternate" type="text/html" hreflang="en_GB" /><updated>2026-08-10T22:53:43+00:00</updated><id>https://canmom.art/feed.xml</id><title type="html">bryn::writing</title><subtitle>a record of existence // Bryn&apos;s writing and art archive</subtitle><entry><title type="html">Let’s read Umineko! - episode 5 - chapter 15</title><link href="https://canmom.art/livereads/umineko/ep5/chapter-15" rel="alternate" type="text/html" title="Let’s read Umineko! - episode 5 - chapter 15" /><published>2026-08-10T00:00:00+00:00</published><updated>2026-08-10T00:00:00+00:00</updated><id>https://canmom.art/livereads/umineko/ep5/chapter-15</id><content type="html" xml:base="https://canmom.art/livereads/umineko/ep5/chapter-15"><![CDATA[<p>Hey Umineko fans! We’re back. It’s… been a pretty crazy few months (always saying that lately.) But, Umineko’s not gone anywhere. Can we wrap up this episode before the next rush around Europe?</p>

<p>Last time, we proved once and for all that Beatrice isn’t real, and Natsuhi totally did all the crimes, even the ones she logically couldn’t have done, and also despite having a red declaration that Natsuhi didn’t dunnit. Good job Erika. It seems like this chapter is setting itself up for a victory lap, presenting a bullshit ‘motivation’ for the crimes, as determined by Erika reading Natsuhi’s diaries.</p>

<p>No comments to respond to this time—either my commenting system broke (lmk if you commented on the last post and it’s not there) or there wasn’t so much to talk about last time—so let’s just get on with it.</p>

<h2 id="episode-15-revenge-after-19-years">Episode 15: <cite>Revenge After 19 Years</cite></h2>

<p>…at this rate this liveblog could take 19 years. Ahem.</p>

<p>OK, so we get a sort of authoritative-sounding, past tense, seemingly omniscient narrator going like ‘After being forced into an unwanted marriage, Natsuhi…’ It’s credited to ‘Trial Summary’, and later, ‘<span class="smallcaps">Bernkastel</span> documents’, ‘submitted evidence’ and even ‘Great Court Internal Documents: Library of Law’. It accuses Natsuhi of fucking Kinzo, as part of a plot to steal the Ushiromiya fortune.</p>

<p>Curiously, it also claims that Natsuhi dressed as <span class="smallcaps">Beatrice</span>, and this was witnessed by an unnamed ‘servant’. That part <em>wasn’t</em> state outright in the trial scene.</p>

<p>One thing that’s kind of curious here is that we have had it stated in red that Natsuhi isn’t the culprit, which means—to an even greater degree than usual in Umineko!—we are to assume that nothing we’re being told here is actually true.</p>

<p>The problem of ‘who moved the bodies’ is solved by blaming it on Kinzo, who in this telling is not dead. We get some additional evidence, like ‘a button from Natsuhi’s clothes’ confirming that she was hiding in the closet after the murder of Hideyoshi.</p>

<p>We end with an official declaration from the Great Court of Illusions that Natsuhi dunnit, signed of course by Dlanor. And then cut back to the parlour scene, where Natsuhi goes ‘just say I did it then’ (which apparently counts as a confession) and Battler, in first-person narration, repeats the conclusions above.</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/108-oh-whatever.webp" alt="Natsuhi, crying: Are you..................satisfied now.........? ......This......is what you wanted to make me say, right......?" loading="lazy" />
    
</figure>

<p>But then she immediately segues into talking about the ‘man from 19 years ago’. She claims one of the people present must be the man’s pawn. Battler observes her looking at ‘some being behind us’… shit is that me…?</p>

<p>Psychologically broken down, Natsuhi confesses to a murder of a baby 19 years ago. So it’s finally time for the other strand of Lambda’s plot to be surfaced to Battler and Erika..? Anyway, Natsuhi says she was commanded to adopt a baby from a ‘welfare institute’ (is this Kinzo’s orphanage..?)</p>

<p>In Natsuhi’s telling, an unnamed ‘servant woman’ followed her around carrying the adopted baby she wanted nothing to do with. In a moment of ‘temptation’, she considered throwing the baby off the cliff. At that moment, she claims, the servant tripped and leaned on the fence, and Natsuhi shoved them both the rest of the way. But her telling is strange: she suggests they were ‘swallowed up by empty space’ instead of falling; it sounds like she’s trying to figure out which memories are real. (Can relate.) The way she describes it, she had a full-on dissociative episode about it, unsure whether she’d pushed or if they fell on their own.</p>

<p>We move to a more summary narration; Kinzo covered up the baby’s existence and the servant was claimed to have died alone. Her husband was paid off and believed the accident story, and later died of old age. Natsuhi says she apologised on his grave (kind of late, huh) but the rest of this must be happening because she never apologised to the baby. So the baby must have survived and grown up to come here and frame her for murder.</p>

<blockquote>
  <p><b class="name">Natsuhi</b> ……And now, ……you’ve taken everything I’ve gained since pushing you off that cliff, 18 years of my life, ……and smashed it all to pieces… ……I no longer have my beloved husband or daughter. ……And I’ve lost even my honor, ……and am being called a murderer… ………No, ……I really am a murderer, aren’t I……</p>
</blockquote>

<p>It’s a very Natsuhi-centric version of events. All of this was orchestrated to fuck with her, definitely couldn’t have any motive separate from her.</p>

<p>Will Erika just weave this into her narrative? Nah, she just brushes it off.</p>

<p>But <em>Battler</em> interjects with his trademark ‘dame da na… zenzen dame da ze’..! And… straight into the ‘credits’ scroll.</p>

<p>In this case many characters are ‘alive when the game was suspended’. Also Battler and the witches get special pre-scroll screens with the ‘breaking glass’ transition. As usual, let’s reproduce it here…</p>

<details>
  <summary>End scroll for Episode 5</summary>

  <figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/109-credits.webp" alt="The credits screen for Episode 5, dividing the characters into 'Died on the first twilight', 'Alive when the game was suspended' or 'Deceased before the game began'." loading="lazy" />
    
</figure>
</details>

<p>Nothing particularly surprising there, though it’s cute that ‘All the goats’ get a credit.</p>

<p>Damn, that was a really short chapter. We probably could’ve knocked this one out back in June. But I guess it’s time we plough on into the tea party… a quick check of the character scenes and the Tips screen reveals nothing particularly new.</p>

<p>I feel like this entry is more plot summary than commentary but there just isn’t much to talk about. It’s cool how they’re messing with the format: the <em>episode</em> ends when the <em>game</em> ends, and it seems like the bulk of the <em>actual</em> ending with thematic resolution etc. will be in the tea parties?</p>

<p>Lucky that with player!Battler dead, piece!Battler still has enough insight to step in!</p>

<p>OK, see you in the tea party~</p>]]></content><author><name></name></author><category term="livereads" /><category term="umineko" /><category term="ep5" /><category term="umineko" /><summary type="html"><![CDATA[in which we're in the wrong confession]]></summary></entry><entry><title type="html">programming grimoire [4]::memories</title><link href="https://canmom.art/programming/magic/4-memory" rel="alternate" type="text/html" title="programming grimoire [4]::memories" /><published>2026-08-09T00:00:00+00:00</published><updated>2026-08-09T00:00:00+00:00</updated><id>https://canmom.art/programming/magic/4-memory</id><content type="html" xml:base="https://canmom.art/programming/magic/4-memory"><![CDATA[<p>Greetings, my student. It has been a long time, longer than we would like.</p>

<p>We have been caught up in great battles of wizards in faraway lands… to cavort with witches and the deer of <a href="https://www.emfcamp.org/">Eastnor</a> and witness lightning dance in the air, and thence to the land of the Finns, a great <a href="https://assembly.org/en">Assembly</a> where some of the mightiest sorcerers of our art compete to show who best commands the thunder of Ukko.</p>

<p>But now we return… and today’s secrets might be some of the most important.</p>

<ol id="markdown-toc">
  <li><a href="#riddles-past" id="markdown-toc-riddles-past">riddles past</a>    <ol>
      <li><a href="#the-second-orb" id="markdown-toc-the-second-orb">The second orb</a></li>
      <li><a href="#the-third-orb" id="markdown-toc-the-third-orb">The third orb</a></li>
    </ol>
  </li>
  <li><a href="#memory" id="markdown-toc-memory">memory</a>    <ol>
      <li><a href="#a-peek-down-a-level" id="markdown-toc-a-peek-down-a-level">a peek down a level</a></li>
    </ol>
  </li>
  <li><a href="#a-quick-primer-on-memory-in-rust" id="markdown-toc-a-quick-primer-on-memory-in-rust">a quick primer on memory in Rust</a>    <ol>
      <li><a href="#the-stack" id="markdown-toc-the-stack">the stack</a></li>
      <li><a href="#the-heap" id="markdown-toc-the-heap">the heap</a></li>
    </ol>
  </li>
  <li><a href="#values-and-references" id="markdown-toc-values-and-references">values and references</a></li>
  <li><a href="#two-other-types-of-language" id="markdown-toc-two-other-types-of-language">two other types of language</a></li>
  <li><a href="#ownership-and-borrowing" id="markdown-toc-ownership-and-borrowing">ownership and borrowing</a>    <ol>
      <li><a href="#functions-eat-things" id="markdown-toc-functions-eat-things">functions eat things</a></li>
      <li><a href="#immutable-references-let-you-look-without-touching" id="markdown-toc-immutable-references-let-you-look-without-touching">immutable references let you look without touching</a></li>
      <li><a href="#mutable-references-are-side-effects" id="markdown-toc-mutable-references-are-side-effects">mutable references are side effects</a></li>
    </ol>
  </li>
  <li><a href="#the-borrow-checker" id="markdown-toc-the-borrow-checker">the borrow checker</a>    <ol>
      <li><a href="#shaking-it-all-about" id="markdown-toc-shaking-it-all-about">shaking it all about</a></li>
      <li><a href="#lifetimes" id="markdown-toc-lifetimes">lifetimes</a></li>
    </ol>
  </li>
  <li><a href="#fourth-orb-to-ponder" id="markdown-toc-fourth-orb-to-ponder">fourth orb to ponder</a></li>
</ol>

<h2 id="riddles-past">riddles past</h2>

<p>First, though, shall we have a quick look at the orbs?</p>

<h3 id="the-second-orb">The second orb</h3>

<p>In <a href="./2-naming">part 2</a>, we were learning about names and scopes; I posed a program, and asked you to figure out what it says. The answer is <a href="https://en.wikipedia.org/wiki/Xyzzy">XYZZY</a>, a magic word of fine vintage. How does it work?</p>

<details>
  <summary>The second orb</summary>
  <p>Here’s the program:</p>

  <div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">spell</span> <span class="o">=</span> <span class="s">"Y"</span><span class="p">;</span>
    <span class="p">{</span>
        <span class="k">let</span> <span class="n">spell</span> <span class="o">=</span> <span class="s">"X"</span><span class="p">;</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">spell</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="p">{</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">spell</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">spell</span> <span class="o">=</span> <span class="s">"Z"</span><span class="p">;</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"{}{}"</span><span class="p">,</span> <span class="n">spell</span><span class="p">,</span> <span class="n">spell</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">spell</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div>  </div>

  <p>On the first line we store <code class="language-plaintext highlighter-rouge">"Y"</code> behind the name <code class="language-plaintext highlighter-rouge">spell</code> in the outer scope.</p>

  <p>We enter the inner scope, and assign <code class="language-plaintext highlighter-rouge">"X"</code> to <code class="language-plaintext highlighter-rouge">spell</code>, which shadows the <code class="language-plaintext highlighter-rouge">spell</code> of the outer scope. Then we print. The most recent definition of <code class="language-plaintext highlighter-rouge">spell</code> available in this scope contains <code class="language-plaintext highlighter-rouge">"X"</code>, so we print X.</p>

  <p>We exit this scope. The inner assignment of <code class="language-plaintext highlighter-rouge">spell</code> is dropped, falling away to reveal the <code class="language-plaintext highlighter-rouge">spell</code> outside.</p>

  <p>We enter a new scope. Now when we print <code class="language-plaintext highlighter-rouge">spell</code>, there are no assignments in this scope, but there’s one in the next scope up, which has <code class="language-plaintext highlighter-rouge">"Y"</code> behind it. So we’re at ‘XY’.</p>

  <p>Now we assign <code class="language-plaintext highlighter-rouge">"Z"</code> to the name <code class="language-plaintext highlighter-rouge">spell</code>, once again shadowing the outer <code class="language-plaintext highlighter-rouge">spell</code>. The <code class="language-plaintext highlighter-rouge">print</code> here prints it twice, so we are at ‘XYZZ’.</p>

  <p>We exit the scope, and the assignment falls away, once again leaving <code class="language-plaintext highlighter-rouge">spell</code> as Y. We print this Y, and we get <code class="language-plaintext highlighter-rouge">XYZZY</code>.</p>
</details>

<p>That is <em>logically</em> what’s going on. But does the compiler actually do all of this? Let’s <a href="https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:rust,selection:(endColumn:5,endLineNumber:2,positionColumn:5,positionLineNumber:2,selectionStartColumn:5,selectionStartLineNumber:2,startColumn:5,startLineNumber:2),source:'%0Apub+fn+main()+%7B%0A++++let+spell+%3D+%22Y%22%3B%0A++++%7B%0A++++++++let+spell+%3D+%22X%22%3B%0A++++++++print!!(%22%7B%7D%22,+spell)%3B%0A++++%7D%0A++++%7B%0A++++++++print!!(%22%7B%7D%22,+spell)%3B%0A++++++++let+spell+%3D+%22Z%22%3B%0A++++++++print!!(%22%7B%7D%7B%7D%22,+spell,+spell)%3B%0A++++%7D%0A++++print!!(%22%7B%7D%22,+spell)%3B%0A%7D%0A'),l:'5',n:'0',o:'Rust+source+%231',t:'0')),k:47.45547073791349,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:r1950,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'0',intel:'0',libraryCode:'0',trim:'1',verboseDemangling:'0'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:1,lang:rust,libs:!(),options:'-C+opt_level%3D2',overrides:!((name:edition,value:'2024')),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+rustc+1.95.0+(Editor+%231)',t:'0')),k:52.54452926208651,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4">drop it into Compiler Explorer</a> and find out. I kind of expected it to be able to see that the program just stores the whole string XYZZY somewhere, but no, it doesn’t seem to be able to simply optimise that away. In fact it produces four separate calls to the print function. Either this machinery is just too opaque or there is some reason the compiler can’t safely make this optimisation.</p>

<h3 id="the-third-orb">The third orb</h3>

<p>In the <a href="./3-functions">third orb</a>, I suggested you could write a program which draws an expanding box by clearing the screen and waiting. Here’s one such program:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">print_room</span><span class="p">(</span><span class="n">width</span><span class="p">:</span> <span class="nb">u32</span><span class="p">,</span> <span class="n">height</span><span class="p">:</span> <span class="nb">u32</span><span class="p">)</span> <span class="p">{</span>
    <span class="nf">print_horizontal_wall</span><span class="p">(</span><span class="n">width</span><span class="p">);</span>

    <span class="k">for</span> <span class="n">_</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">height</span> <span class="p">{</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"#"</span><span class="p">);</span>
        <span class="k">for</span> <span class="n">_</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">width</span> <span class="p">{</span>
            <span class="nd">print!</span><span class="p">(</span><span class="s">"."</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"#"</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="nf">print_horizontal_wall</span><span class="p">(</span><span class="n">width</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">print_horizontal_wall</span><span class="p">(</span><span class="n">width</span><span class="p">:</span> <span class="nb">u32</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">for</span> <span class="n">_</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">width</span> <span class="o">+</span> <span class="mi">2</span> <span class="p">{</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"#"</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="c1">//print a newline to end the row</span>
    <span class="nd">println!</span><span class="p">();</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">clear_console</span><span class="p">()</span> <span class="p">{</span>
    <span class="nd">print!</span><span class="p">(</span><span class="s">"{esc}c"</span><span class="p">,</span> <span class="n">esc</span> <span class="o">=</span> <span class="mi">27</span> <span class="k">as</span> <span class="nb">char</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">for</span> <span class="n">tick</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="mi">60</span> <span class="p">{</span>
        <span class="nf">clear_console</span><span class="p">();</span>
        <span class="nf">print_room</span><span class="p">(</span><span class="n">tick</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
        <span class="nn">std</span><span class="p">::</span><span class="nn">thread</span><span class="p">::</span><span class="nf">sleep</span><span class="p">(</span><span class="nn">std</span><span class="p">::</span><span class="nn">time</span><span class="p">::</span><span class="nn">Duration</span><span class="p">::</span><span class="nf">from_millis</span><span class="p">(</span><span class="mi">1000</span> <span class="o">/</span> <span class="mi">60</span><span class="p">));</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Each time around, the loop clears away all the current text in the console, prints a slightly bigger room, and then tells the operating system that it’s done with its work for now but please could it be woken up in 1/60 seconds.</p>

<p>Previously our computations were pretty abstract, all we cared to see was the final answer… but here we’re placing our program in the world, and worrying about how much time things take. (Can we be sure that the operating system, which is juggling this and hundreds of other programs, will give us a consistent framerate?) Time will be immensely important later when we do more graphics stuff. But we won’t worry about that yet.</p>

<p>No, there is another part of the temple we need to build in our minds at this point… something we’ve been dancing around a little in the story so far.</p>

<p>It’s almost time to introduce arrays, structs and other ways to make more complicated types. But first, it’s time to talk about <em>memory</em>.</p>

<h2 id="memory">memory</h2>

<p>So computers have ‘memory’. You probably know already that this stores all the things the computer is actively doing. If you don’t have enough RAM, your computer can run out and slow down or crash. <del>Better download some more…</del> And of course it’s too damn expensive these days. But from the perspective of a <em>programmer</em>, by which of course we mean a sorcerer schooled in the Arts, what is memory?</p>

<p>Let’s start as simple as we can and build up.</p>

<h3 id="a-peek-down-a-level">a peek down a level</h3>

<p><dfn>Memory</dfn> is how your computer holds on to calculations so it can use the results later.</p>

<p>Although I usually try to say on the Rust level of abstraction, I think it’s quite helpful to know what memory looks like to the CPU. From a program’s point of view, we can think of it as a huuuuuuuuuuuuuuuuuuuuuuuuuge long list of bytes. Every single one of those bytes has an “address”, which is basically just a number.</p>

<p>It might be something like this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>address: 00       01       02       03       04       05       06       07       08       09       0A       0B       0C       0D
data:    01001101 01100001 01100111 01110011 00100000 01101001 01110011 00100000 01100011 01110101 01110100 01100101 00100001 00100001 

</code></pre></div></div>

<p>So the address numbers just go up, and each number points to a specific byte. The CPU runs instructions like ‘get me the byte at 0x0B’ or ‘put this value in 0x03’.</p>

<p>In this little example, memory addresses are only one byte, which means that the computer could only hold a maximum of 256 bytes of memory. Most modern computers are ‘64-bit’, which means they use eight bytes to represent a memory address, for example 0xCAFEBABEDEADBEEF or 0xBAAAAAAAAAAAAAAD. The type of number used for memory addresses has the special type <code class="language-plaintext highlighter-rouge">usize</code> in Rust; on a 64-bit computer that’s equivalent to a <code class="language-plaintext highlighter-rouge">u64</code>, on a 32-bit computer it’s a <code class="language-plaintext highlighter-rouge">u32</code>, and so on.</p>

<aside>In theory the maximum possible amount of memory a 64-bit computer could address is 18446744073709551616 bytes, or about 18.4 exabytes. As incomprehensibly large as this value is, the internet contains orders of magnitude more data going to and fro. Still, we won't see a computer with this much RAM for a long, long time.</aside>

<p>However…</p>

<p>For <em>logical</em> purposes, it doesn’t really matter what form a memory address takes. All we need to know is that we can put things down and keep an address to look them up again later.</p>

<p>Now, I’m leaving out a <em>lot</em> of details here. For one thing, we also have tiny bits of memory inside the CPU called ‘registers’ and ‘caches’. And there are many fiddly details: virtual memory, address spaces, cache lines, alignment, etc. etc.; perhaps we will come back to these things later.</p>

<p>All of that is implementation details, though. Important when you want to write fast code… but <em>logically</em>, all you need to know is that you can put things in memory and look them up with addresses. So let’s try to understand the abstraction that all that stuff is working to create.</p>

<h2 id="a-quick-primer-on-memory-in-rust">a quick primer on memory in Rust</h2>

<p>Goodness, are we going to have to go around writing out all our <code class="language-plaintext highlighter-rouge">0xDEADBEEF</code> values by hand? Fortunately not; in modern programming languages, all of that is tucked away out of sight.</p>

<p>In Rust, there are two areas of memory. They’re called the <dfn>stack</dfn> and the <dfn>heap</dfn>. If you’re, hypothetically speaking, a <cite>Netrunner</cite> player, these words might ring a bell… and unfortunately they will give you the wrong intuition, sorry :p</p>

<h3 id="the-stack">the stack</h3>

<p>So far we’ve mostly been messing with the stack. When we write something like…</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">homura</span><span class="p">:</span> <span class="nb">u8</span> <span class="o">=</span> <span class="mi">0x68</span><span class="p">;</span> <span class="c1">//ASCII 'h'</span>
<span class="p">}</span>
</code></pre></div></div>
<p>…in principle, Rust will pick some little bit of memory to store that value. The place where <code class="language-plaintext highlighter-rouge">let</code> bindings go is called the stack.</p>

<p>Under the hood, it works in a very simple way: the stack is just all the different values we’ve named, concatenated one after the other in the order we assigned them, in a specially set aside space of memory.</p>

<p>You don’t <em>really</em> need to know more than that, but just for fun, let’s have a look at how the stack actually works. It goes like this:</p>

<ul>
  <li>the program stores the memory address of the end of the stack (which we call the ‘stack pointer’, since it points to the end of the stack)</li>
  <li>whenever you create a new variable, it gets stuck on the end of the stack, and the program moves the ‘end of the stack’ address to a lower memory address</li>
  <li>when you exit a scope, everything in that scope gets removed from the stack, and the ‘end of stack’ address jumps back up</li>
</ul>

<p>So, let’s say the stack is something like this…</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>06   ????????
07   ????????
08   ????????
09   ???????? &lt;- STACK POINTER (new stuff goes here)
0A   01101001 &lt;- some variable
0B   00100001 
</code></pre></div></div>
<p>And we want to store a new value like <code class="language-plaintext highlighter-rouge">let homura: u8 = 0x68</code>. The <code class="language-plaintext highlighter-rouge">u8</code> type has the size one byte. So we move the stack pointer down a byte, and fill in the value. 0x68 is <code class="language-plaintext highlighter-rouge">01000100</code> in binary. The result is…</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>07   ????????
08   ???????? &lt;- STACK POINTER (new stuff goes here)
09   01000100 &lt;- foo (least significant byte)
0A   01101001 &lt;- some other variable
0B   00100001 
</code></pre></div></div>
<p>Now <code class="language-plaintext highlighter-rouge">homura</code> has moved into the address 0x09. She’ll be starting school soon, wonder if she’ll meet anyone cool…</p>

<p>The compiler knows that if, later on, we ask for the value of <code class="language-plaintext highlighter-rouge">homura</code>, it can read it from <code class="language-plaintext highlighter-rouge">0x09</code>. That’s the basic idea! It’s pretty simple. The stack gets longer and longer as we define more variables. If we define too many variables and the stack runs out of memory, it’s called a ‘stack overflow’ and the program crashes. But usually, there’s loads of space and the only time a stack overflow happens is heavy recursion.</p>

<aside>Note that the compiler doesn't have to actually put your value on the actual stack in memory! If it can keep it in a CPU register and avoid touching memory, it will generally do that. But you can still think about your program as if every `let` binding and function argument puts something on the stack. <em>Logically</em>, the program will act 'as if' that is true.</aside>

<h3 id="the-heap">the heap</h3>

<p>Although the stack is super nice, super simple and super easy to understand, it’s got some limitations. In particular, everything on the stack must have a fixed size that never ever changes. And there’s a very strict order in which things must be created or destroyed—you can’t really just delete something from the middle of the stack and use that space for something else. It can also be troublesome with very large blocks of data.</p>

<p>There is another place to put things in Rust known as the ‘heap’. This is basically all the memory that <em>isn’t</em> the stack.</p>

<p>Some operations will <dfn>allocate</dfn> stuff on the heap, which basically means invoking machinery which says ‘hey, give me some memory of this size’; a piece of the heap will be duly carved out.</p>

<aside>The actual details of how this happens are fairly involved. First the program requests some memory from the operating system; then a piece of the program called the "global allocator" portions it out as needed. It has to decide where to put things in memory, in order to leave enough space for other stuff, and that's where things get complicated.</aside>

<p>There are lots of different types in the Rust standard library which use the heap, such as <code class="language-plaintext highlighter-rouge">Box</code>, <code class="language-plaintext highlighter-rouge">Rc</code>, <code class="language-plaintext highlighter-rouge">Vec</code> and <code class="language-plaintext highlighter-rouge">String</code>. We’ll meet some of them later in this series. For now, though, we won’t complicate things too much; let’s stick with stack-allocated values, there will be plenty to think about!</p>

<h2 id="values-and-references">values and references</h2>

<p>OK, we know that variables live in memory, and much like fossil fuel CEOs, they have names and addresses. But what can we do with that?</p>

<p>Like lots of languages, Rust can have types which point to other types. In Rust, the main type that does this is known as a reference. If <code class="language-plaintext highlighter-rouge">foo</code> is something, then <code class="language-plaintext highlighter-rouge">&amp;foo</code> is a <dfn>reference to foo</dfn>.</p>

<p>It’s kind of like this. A regular variable just has a name point directly to a value…</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>name -----&gt; value
</code></pre></div></div>
<p>But for a reference, the value is itself something which points to a value, so it’s more like this…</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>name -----&gt; reference -----&gt; value
</code></pre></div></div>

<p>To get at the value behind the reference, you can <dfn>dereference</dfn> it with the <code class="language-plaintext highlighter-rouge">*</code> operator, not to be confused with multiplication…</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="c1">//the latitude, if you're wondering</span>
    <span class="k">let</span> <span class="n">jeff_bezos_house</span><span class="p">:</span> <span class="nb">f32</span> <span class="o">=</span> <span class="mf">34.086111</span><span class="p">;</span>

    <span class="c1">//behind this name is a reference to the number</span>
    <span class="k">let</span> <span class="n">address</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">jeff_bezos_house</span><span class="p">;</span>

    <span class="c1">//this makes a copy of the number and stores it in 'found_him'.</span>
    <span class="k">let</span> <span class="n">found_him</span> <span class="o">=</span> <span class="o">*</span><span class="n">address</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Just like regular variables, references can be mutable or immutable. You write a mutable reference with <code class="language-plaintext highlighter-rouge">&amp;mut</code>:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="c1">//mutable because jeff bezos is not immortal</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">jeff_bezos_alive</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"Is Jeff alive? {jeff_bezos_alive}"</span><span class="p">);</span>
    
    <span class="k">let</span> <span class="n">target</span> <span class="o">=</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">jeff_bezos_alive</span><span class="p">;</span>
    <span class="c1">//we have an address again, but this time we can do things </span>
    <span class="c1">//to the value on the other side!</span>
    
    <span class="c1">//dereference the address and assign a value through it</span>
    <span class="o">*</span><span class="n">target</span> <span class="o">=</span> <span class="k">false</span><span class="p">;</span>
    
    <span class="c1">//prints false; the original value has been</span>
    <span class="c1">//modified through the reference!</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"Is Jeff alive now?? {jeff_bezos_alive}"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Now, whyever would you want something like that?</p>

<p>The basic and universal answer is that, in a complex program, it may be useful to have multiple names in the program which at least soemtimes refer to the same thing. You can build complicated structures of things pointing to other things.</p>

<p>But more specifically, for Rust, the reason has to do with its ‘ownership’ model. Strap in.</p>

<h2 id="two-other-types-of-language">two other types of language</h2>

<p>In older languages such as C, you told the compiler exactly when to delete something from memory (aka ‘freeing’ it).</p>

<p>But this could be a problem: let’s say another part of the program has some reference (in C, this would be called a ‘pointer’; the difference isn’t that important) to the thing you just deleted. Before you deleted the thing, all would be well: the reference points to the thing you’d expect. But <em>after</em> you deleted it, it’s not there anymore! The program could put some entirely different thing in that memory address.</p>

<p>This is known as a ‘use after free’ bug, and hackers love to find them, because you can use it to start poking around in places you’re not supposed to, or change bits of the program state. Great way to take control!</p>

<p>‘Garbage collected’ languages work differently. The program has some additional machinery called a ‘runtime’, which keeps track of how many references exist to everything in the program. Every so often, the program stops for a moment, and a special piece of machinery called the ‘garbage collector’ goes around and checks if anything has zero references and deletes it… and then, checks again because maybe the thing that just got deleted was holding a reference to another thing, and so on. This means you can never have a ‘use after free’, because nothing will be freed while it’s still used.</p>

<p>Garbage collectors are very clever creations, and a great deal of research has gone into making them work as well as they do. But they do incur an overhead which makes your program have to do a bunch of extra work all the time, and when performance is very important (e.g. in a game) they can cause unpredictable hitches which you generally do not want. Plus, someone has to actually <em>implement</em> the garbage collector, which means using a language that isn’t garbage-collected.</p>

<h2 id="ownership-and-borrowing">ownership and borrowing</h2>

<p>Rust was invented to have a secret third option. You don’t manually manage memory (unless you go into <code class="language-plaintext highlighter-rouge">unsafe</code> Rust, but we won’t be doing that for a while!), but you also don’t need to have a garbage collector. How can that work?</p>

<p>So, remember how we said that names live in scopes, and when a name goes out of scope it disappears?</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="c1">//here is a scope...</span>
    <span class="p">{</span>
        <span class="k">let</span> <span class="n">bar</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"Bar is fine to print here: {bar}"</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"But printing {bar} here will give a compiler error."</span><span class="p">);</span>
    <span class="c1">//this won't compile!</span>
<span class="p">}</span>
</code></pre></div></div>
<p>That’s basically the whole trick. The confusing jargon term for this system, which comes from C++, is RAII (standing for Resource Acquisition Is Initialisation). When you leave a scope and invalidate a name, the memory assigned to store that value also gets freed.</p>

<p>A particular consequence of this is that, without references or copying, functions ‘eat’ their arguments.</p>

<h3 id="functions-eat-things">functions eat things</h3>

<p>I can’t actually demonstrate this with numbers or string slices since they are what are called <code class="language-plaintext highlighter-rouge">Copy</code> types, so lets quickly introduce another type. We can declare a new type like this, using the <code class="language-plaintext highlighter-rouge">struct</code> keyword:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">struct</span> <span class="n">Edible</span><span class="p">;</span>
</code></pre></div></div>
<p>Once this is written in your program, the world of Rust just got slightly bigger: there are now <code class="language-plaintext highlighter-rouge">Edible</code>s in it. Yum. (Like function declarations, it doesn’t matter where in the file you put this declaration, as long as it’s outside any scopes.)</p>

<p>We’ll go <em>way</em> more into the subject of creating new types very soon, but for now, <code class="language-plaintext highlighter-rouge">Edible</code> is a ‘unit type’, which means you can create a new <code class="language-plaintext highlighter-rouge">Edible</code> just by writing <code class="language-plaintext highlighter-rouge">Edible</code>:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">struct</span> <span class="n">Edible</span><span class="p">;</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">tasty_thing</span> <span class="o">=</span> <span class="n">Edible</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>The rule is this: there can only be one name which authoritatively <em>owns</em> the value.</p>

<p>So, if we assign the value of <code class="language-plaintext highlighter-rouge">tasty_thing</code> to another variable, Rust will <em>move</em> the value of the <code class="language-plaintext highlighter-rouge">Edible</code> to that new name, and the old name will be invalidated.</p>
<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">your_tasty_thing</span> <span class="o">=</span> <span class="n">Edible</span><span class="p">;</span>
    
    <span class="c1">//moves the value to the new name</span>
    <span class="k">let</span> <span class="n">my_tasty_thing</span> <span class="o">=</span> <span class="n">your_tasty_thing</span><span class="p">;</span> 

    <span class="c1">//this will fail because the value has already been moved!</span>
    <span class="k">let</span> <span class="n">someone_elses_tasty_thing</span> <span class="o">=</span> <span class="n">your_tasty_thing</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>If you try to compile this, the compiler will tell you that you’re using something after it’s been moved. (It will also suggest a way to fix this, but don’t worry about that for now.)</p>

<p>This ‘move’ is only an abstract, logical thing. The compiler will not necessarily actually move the data someplace else in memory (though it might!). It just changes the name for the value.</p>

<p>The main reason this matters is that the same thing applies to function arguments. If we write a function which takes <code class="language-plaintext highlighter-rouge">Edible</code>s as input ‘by value’…</p>
<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">eat</span><span class="p">(</span><span class="n">food</span><span class="p">:</span> <span class="n">Edible</span><span class="p">)</span> <span class="p">{</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"Omnomnomnomnom"</span><span class="p">);</span>
    <span class="c1">//doesn't matter what we do here</span>
<span class="p">}</span>
</code></pre></div></div>
<p>then, if we call this function, the argument gets moved into the function scope and dropped at the end.</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">your_cake</span> <span class="o">=</span> <span class="n">Edible</span><span class="p">;</span>
    <span class="nf">eat</span><span class="p">(</span><span class="n">your_cake</span><span class="p">);</span>
    <span class="c1">//fails because your_cake has been moved!</span>
    <span class="k">let</span> <span class="n">cake_you_have</span> <span class="o">=</span> <span class="n">your_cake</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>To be clear, these rules don’t apply to anything that is <code class="language-plaintext highlighter-rouge">Copy</code>, which mostly includes simple things like numbers, but also includes references. If something is <code class="language-plaintext highlighter-rouge">Copy</code>, you can have it and eat it just fine. I’ll save further discussion of what it means to ‘be <code class="language-plaintext highlighter-rouge">Copy</code>’ for later, when we talk about another feature called ‘traits’.</p>

<h3 id="immutable-references-let-you-look-without-touching">immutable references let you look without touching</h3>

<p>OK, but what if we want to pass something to a function <em>without</em> eating it? This can be done by making the argument be a reference instead!</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">//this function takes a reference to an Edible, not an Edible</span>
<span class="k">fn</span> <span class="nf">examine</span><span class="p">(</span><span class="n">food</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">Edible</span><span class="p">)</span> <span class="p">{</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"I'll give it back, don't worry!"</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">your_cake</span> <span class="o">=</span> <span class="n">Edible</span><span class="p">;</span>
    <span class="nf">examine</span><span class="p">(</span><span class="o">&amp;</span><span class="n">your_cake</span><span class="p">);</span><span class="c1">//only a reference gets eaten</span>
    <span class="k">let</span> <span class="n">cake_you_have</span> <span class="o">=</span> <span class="n">your_cake</span><span class="p">;</span> <span class="c1">//works just fine</span>
<span class="p">}</span>
</code></pre></div></div>
<h3 id="mutable-references-are-side-effects">mutable references are side effects</h3>

<p>We can also use <em>mutable</em> references to allow functions to modify things outside of their scope. For example, in an RPG you might have something like this…</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">inflict_damage</span><span class="p">(</span><span class="n">health</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="nb">i32</span><span class="p">,</span> <span class="n">damage</span><span class="p">:</span> <span class="nb">i32</span><span class="p">)</span> <span class="p">{</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"You get hit for {damage} damage. Ouch!"</span><span class="p">)</span>
    <span class="o">*</span><span class="n">health</span> <span class="o">=</span> <span class="o">*</span><span class="n">health</span> <span class="o">-</span> <span class="n">damage</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">your_health</span> <span class="o">=</span> <span class="mi">1000</span><span class="p">;</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"You have {your_health} health."</span><span class="p">);</span> <span class="c1">//1000</span>
    <span class="nf">inflict_damage</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="n">your_health</span><span class="p">,</span> <span class="mi">100</span><span class="p">);</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"You have {your_health} health."</span><span class="p">);</span> <span class="c1">//900</span>
<span class="p">}</span>
</code></pre></div></div>
<p>By feeding functions mutable references, we can give them side effects! (Functional programmers in the audience are tutting and shaking their heads.)</p>

<h2 id="the-borrow-checker">the borrow checker</h2>

<p>Although we can borrow values, there are some restrictions. These mostly exist in order to prevent certain types of bugs in multi-threaded programming, where two parts of the program are trying to interact with the same piece of memory at the same time. Rust is designed to make this easy as possible, and it can only do this with certain restrictions baked into the language.</p>

<p>Even though we won’t be doing multithreading for a while, it’s important to explain them here, so you don’t get caught by surprise!</p>

<p>The very important rule is this…</p>

<p><strong>at any time, there can be <em>either</em>:</strong></p>

<ul>
  <li><strong>any number of immutable references</strong></li>
</ul>

<p><strong><em>or</em></strong></p>

<ul>
  <li><strong>only one mutable reference</strong></li>
</ul>

<p><strong>to the same value, never both</strong>.</p>

<p>The Rust compiler is generally pretty smart these days: if you create a mutable reference, it will invalidate any immutable references you might have created, and vice versa. So doing this is actually fine…</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="c1">//needs to be mutable or we can't create mutable references</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">house</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>

    <span class="c1">//fine, there are no references</span>
    <span class="k">let</span> <span class="n">ref_1</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">house</span><span class="p">;</span>

    <span class="c1">//fine, there are only immutable references</span>
    <span class="k">let</span> <span class="n">ref_2</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">house</span><span class="p">;</span>

    <span class="c1">//fine since we can drop all immutable references</span>
    <span class="k">let</span> <span class="n">mutable_ref</span> <span class="o">=</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">house</span><span class="p">;</span> 

    <span class="c1">//fine since we can drop the mutable reference</span>
    <span class="k">let</span> <span class="n">ref_3</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">house</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>But if you refer to an immutable reference you created earlier, then we have trouble!</p>
<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="c1">//needs to be mutable or we can't create mutable references</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">house</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>

    <span class="c1">//fine, there are no references</span>
    <span class="k">let</span> <span class="n">immutable_ref</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">house</span><span class="p">;</span>

    <span class="c1">//not allowed!! since the immutable ref is still in use</span>
    <span class="k">let</span> <span class="n">mutable_ref</span> <span class="o">=</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">house</span><span class="p">;</span>

    <span class="c1">//this line means we can't drop immutable_ref</span>
    <span class="k">let</span> <span class="n">mouse</span> <span class="o">=</span> <span class="o">*</span><span class="n">immutable_ref</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>If you try to compile this, the compiler will give you a nice colourful explanation of the problem. I can’t reproduce the colours on here but here’s what it looks like</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>error[E0502]: cannot borrow `house` as mutable because it is also borrowed as immutable
  --&gt; src/main.rs:44:23
   |
 5 |     let immutable_ref = &amp;house;
   |                         ------ immutable borrow occurs here
...
 8 |     let mutable_ref = &amp;mut house;
   |                       ^^^^^^^^^^ mutable borrow occurs here
...
11 |     let mouse = *immutable_ref; 
   |                 -------------- immutable borrow later used here
</code></pre></div></div>
<p>In the old days of Rust, the compiler wasn’t nearly so clever about this, and people would complain about having to ‘fight the borrow checker’ all the time. But now this kind of problem comes up only rarely. In the course of making <cite>Shaderland</cite> there was maybe only one time when I felt I had to do anything annoying to keep the borrow checker happy.</p>

<h3 id="shaking-it-all-about">shaking it all about</h3>

<p>Note that there is one other way for functions not to permanently eat stuff: if they have a return value, that pops back out into the enclosing scope and doesn’t get deleted. Which we can fold into our metaphor, and I’m very sorry for this…</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">eat_and_shit_out</span><span class="p">(</span><span class="n">food</span><span class="p">:</span> <span class="n">Edible</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">Edible</span> <span class="p">{</span>
    <span class="n">food</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">tasty_thing</span> <span class="o">=</span> <span class="n">Edible</span><span class="p">;</span>

    <span class="k">let</span> <span class="n">bezoar</span> <span class="o">=</span> <span class="nf">eat_and_shit_out</span><span class="p">(</span><span class="n">tasty_thing</span><span class="p">);</span>
    <span class="c1">//the value has now moved into bezoar, unchanged</span>
<span class="p">}</span>
</code></pre></div></div>
<p>You can also return references, if you want to.</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">inspect</span><span class="p">(</span><span class="n">thing</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">Edible</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="o">&amp;</span><span class="n">Edible</span> <span class="p">{</span>
    <span class="n">thing</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="lifetimes">lifetimes</h3>

<p>This is an advanced topic and one we’ll cover in much more detail later on.</p>

<p>All that stuff above about how Rust prevents use-after-free and so on? Only works if the references can be <em>proven</em> not to stick around after the thing they’re referring to. The way Rust does this is… I mean I know I’ve been doing a bit of a silly occultism theme through all this but this is maybe the most magical thing going on here.</p>

<p>Essentially, everything in Rust has a ‘lifetime’. This is a slightly nebulous thing but it’s basically a way of keeping track of which order you can delete things.</p>

<p>We write lifetimes with an apostrophe like <code class="language-plaintext highlighter-rouge">'l</code>, and you most often see them on references: <code class="language-plaintext highlighter-rouge">&amp;'l Thing</code> is a reference to a <code class="language-plaintext highlighter-rouge">Thing</code> and that reference has lifetime <code class="language-plaintext highlighter-rouge">'l</code>. (If you don’t write the lifetime, Rust will still be figuring it out behind the scenes; this is an <dfn>implicit</dfn> lifetime.)</p>

<p>Lifetimes relate to other lifetimes; indeed, they don’t do very much else. Saying <code class="language-plaintext highlighter-rouge">'l1: 'l2</code> means that lifetime <code class="language-plaintext highlighter-rouge">'l1</code> <em>cannot live longer than</em> <code class="language-plaintext highlighter-rouge">'l2</code>. Which is to say, everything with lifetime <code class="language-plaintext highlighter-rouge">'l1</code> <em>must</em> be deleted before anything of <code class="language-plaintext highlighter-rouge">'l2</code> gets deleted. If the compiler can’t prove this is true on a type level, then the program won’t compile.</p>

<p>Why bring this up now? Occasionally, usually when you’re passing references around, Rust will require you to declare explicitly which lifetime is being used. We’ll see an example of this in the Orb.</p>

<h2 id="fourth-orb-to-ponder">fourth orb to ponder</h2>

<p>We have just finished drawing one of the most important magic circles in our ritual! However, it will be hard to get an intuition for this until you start using it. And to do that, there are still a few more runes we need to draw.</p>

<p>Still, we can always make a horribly perverse maze. (Seriously, this feels mean, nobody should write Rust like this.) Watch out for the shadows!</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">//we'll learn more about enums next time</span>
<span class="c1">//but the short version is this lets you say a type can be one of a fixed list of things</span>
<span class="nd">#[derive(Debug)]</span>
<span class="k">enum</span> <span class="n">Room</span> <span class="p">{</span>
    <span class="n">Treasure</span><span class="p">,</span>
    <span class="n">Doom</span><span class="p">,</span>
<span class="p">}</span>

<span class="c1">//always goes to the room on the left</span>
<span class="c1">//note that we need to make the lifetime explicit here!</span>
<span class="k">fn</span> <span class="n">left</span><span class="o">&lt;</span><span class="nv">'a</span><span class="o">&gt;</span><span class="p">(</span><span class="n">l</span><span class="p">:</span> <span class="o">&amp;</span><span class="nv">'a</span> <span class="n">Room</span><span class="p">,</span> <span class="n">_r</span><span class="p">:</span> <span class="o">&amp;</span><span class="nv">'a</span> <span class="n">Room</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="o">&amp;</span><span class="nv">'a</span> <span class="n">Room</span> <span class="p">{</span>
    <span class="n">l</span>
<span class="p">}</span>

<span class="c1">//always goes to the room on the right</span>
<span class="k">fn</span> <span class="n">right</span><span class="o">&lt;</span><span class="nv">'a</span><span class="o">&gt;</span><span class="p">(</span><span class="n">_l</span><span class="p">:</span> <span class="o">&amp;</span><span class="nv">'a</span> <span class="n">Room</span><span class="p">,</span> <span class="n">r</span><span class="p">:</span> <span class="o">&amp;</span><span class="nv">'a</span> <span class="n">Room</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="o">&amp;</span><span class="nv">'a</span> <span class="n">Room</span> <span class="p">{</span>
    <span class="n">r</span>
<span class="p">}</span>

<span class="c1">//a silly rusty maze</span>
<span class="c1">//one reference leads to treasure, the other to certain doom</span>
<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">amazing_wizard_orb</span> <span class="o">=</span> <span class="nn">Room</span><span class="p">::</span><span class="n">Treasure</span><span class="p">;</span>
    <span class="k">let</span> <span class="n">doom</span> <span class="o">=</span> <span class="nn">Room</span><span class="p">::</span><span class="n">Doom</span><span class="p">;</span>
    <span class="k">let</span> <span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span> <span class="o">=</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="nf">left</span><span class="p">(</span><span class="o">&amp;</span><span class="n">amazing_wizard_orb</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">doom</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="nf">right</span><span class="p">(</span><span class="o">&amp;</span><span class="n">amazing_wizard_orb</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">doom</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">c</span> <span class="o">=</span> <span class="nf">left</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">);</span>
        <span class="c1">//a shadow attacks!</span>
        <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="nf">left</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">a</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">d</span> <span class="o">=</span> <span class="nf">right</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
        <span class="c1">//a shadow attacks!</span>
        <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="nf">right</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">e</span> <span class="o">=</span> <span class="nf">left</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">d</span><span class="p">);</span>
        <span class="c1">//a shadow attacks!</span>
        <span class="k">let</span> <span class="n">d</span> <span class="o">=</span> <span class="nf">right</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">f</span> <span class="o">=</span> <span class="nf">left</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">e</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">g</span> <span class="o">=</span> <span class="nf">right</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">f</span><span class="p">);</span>
        <span class="c1">//a shadow attacks!</span>
        <span class="k">let</span> <span class="n">f</span> <span class="o">=</span> <span class="nf">right</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">h</span> <span class="o">=</span> <span class="nf">left</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">g</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">i</span> <span class="o">=</span> <span class="nf">right</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">h</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">j</span> <span class="o">=</span> <span class="nf">left</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span>
        <span class="c1">//a shadow attacks!</span>
        <span class="k">let</span> <span class="n">h</span> <span class="o">=</span> <span class="nf">right</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">k</span> <span class="o">=</span> <span class="nf">left</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">f</span><span class="p">);</span>
        
        <span class="k">let</span> <span class="n">l</span> <span class="o">=</span> <span class="nf">left</span><span class="p">(</span><span class="n">k</span><span class="p">,</span><span class="n">h</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">r</span> <span class="o">=</span> <span class="nf">right</span><span class="p">(</span><span class="n">k</span><span class="p">,</span><span class="n">h</span><span class="p">);</span>

        <span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
    <span class="p">};</span>
    <span class="c1">//uncomment this line to take the left path</span>
    <span class="c1">//println!("I took the left path, and found my way to {l:?}");</span>
    <span class="c1">//uncomment this line to take the right path</span>
    <span class="c1">//println!("I took the right path, and found my way to {r:?}");</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Can you figure out which path to take to get through the maze?</p>

<p>Next time, we’ll look at this ‘defining new types’ business, and finally get to arrays!</p>]]></content><author><name></name></author><category term="programming" /><category term="magic" /><category term="programming grimoire" /><summary type="html"><![CDATA[We find out where computer things live.]]></summary></entry><entry><title type="html">programming grimoire [0]::overture</title><link href="https://canmom.art/programming/magic/0-preamble" rel="alternate" type="text/html" title="programming grimoire [0]::overture" /><published>2026-06-07T00:00:00+00:00</published><updated>2026-06-07T00:00:00+00:00</updated><id>https://canmom.art/programming/magic/0-preamble</id><content type="html" xml:base="https://canmom.art/programming/magic/0-preamble"><![CDATA[<p>This is a story we are going to tell about magic. We should perhaps start with that rather dreaded question: <em>is magic real?</em></p>

<ol id="markdown-toc">
  <li><a href="#a-magic-trick" id="markdown-toc-a-magic-trick">a magic trick</a></li>
  <li><a href="#where-it-came-from" id="markdown-toc-where-it-came-from">where it came from</a>    <ol>
      <li><a href="#interacting-with-entities" id="markdown-toc-interacting-with-entities">interacting with entities</a></li>
    </ol>
  </li>
  <li><a href="#what-is-a-computer" id="markdown-toc-what-is-a-computer">what is a computer</a>    <ol>
      <li><a href="#a-little-history-tangent" id="markdown-toc-a-little-history-tangent">a little history tangent</a></li>
      <li><a href="#whats-in-a-word" id="markdown-toc-whats-in-a-word">what’s in a word</a></li>
    </ol>
  </li>
</ol>

<p>You might have a variety of answers to this question. It rather depends on what, exactly, we mean by “magic”, and also by “real”, right? (Maybe we can add “is” while we’re at it.)</p>

<details>
  <summary>magic in fiction</summary>

  <p>In fiction, ‘magic’ can be all sorts of shit. In older works, which draw more directly on mythology: some <a href="https://en.wiktionary.org/wiki/numinous">numinous</a>, inexplicable force intervenes to structure a narrative. It’s not without restrictions; magic might be imbued in physical artefacts (the seven-league boots, the magic sword), it may be an ability (transforming into an animal) that only some people have, it might involve forming relationships with powerful nonhuman creatures such as gods; you just have to take on faith that these things can happen.</p>

  <p>For the sake of dramatic tension, it is usually available to the protagonists of a story only in limited ways. Taking after figures such as Merlin, the magician (disguised angel, talking lion) is a weirdo, who is sought out or else shows up sometimes for inscrutable reasons; they may help at a cost, or in recognition of the hero’s virtues. In ‘sword and sorcery’ works, magicians tend to be an antagonist (a sorcerer that Conan must kill, the sneering wizard who teleports Cugel at the outset of his journey) or at least an antihero (Elric).</p>

  <p>In more modern works in what has become known as the ‘fantasy’ genre, coming in the wake of transitional works like <cite>A Wizard of Earthsea</cite>, you are more likely to encounter a ‘magic system’ with more explicit rules, which typically grants certain characters in the narrative special abilities. (This is not always <em>called</em> magic; it might instead be deemed ‘superpowers’ or ‘psychic powers’ or ‘mutations’.) The convention is that the rules will be laid out and have some central theme or logical structure, and the protagonists should stay within them, cleverly exploiting their structure to advantage.</p>

  <p>Meanwhile, in supernatural ‘horror’, elements of ‘magic’ (demons, ghosts, cenobites…) tend to intrude violently on everday life; elsewhere again, in the ‘magical realism’ genre, things we call ‘magic’ are simply present and have some role to play in the modern world (a family member becomes a jiangshi, someone can teleport), typically serving a more metaphorical purpose—to fulfil its role in the story, such ‘magic’ tends to be weird and disorienting.</p>

  <p>In all these cases, in analysing fiction, we label a thing ‘magic’ because (we believe) it doesn’t happen in the ‘real world’, and it fills certain recognised narrative roles.</p>

</details>

<p>In our world, there are many practices which fall under this nebulous label of ‘magic’, ‘esotericism’, ‘occultism’ and the like, blending continuously with the wider world of religion. Some people pursue membership in orders, study tables of correspondences, or draw sigils. They may speak of making contact and forming relationships with an impressive array of “entities”, and observe certain rituals in respect to them, or warn each other of the great dangers of reckless magic workings. Other people may say they can detect auras, discern hidden information, or bring subtle benefits or harm. People may use various powerful tools to get their minds into a shape more amenable to interaction with gods, spirits, and other entities: psychedelic drugs, group worship, extreme endurance, sexuality, hypnosis…</p>

<p>Others, describing themselves as skeptics, disparage these practices or at least their claimed effects, talking about cognitive biases, superstitions, and so forth; in response, there are plenty of people (all the way up to national intelligence agencies) who pursue rigorous experiments to detect or rule out such ‘supernatural’ effects, a research programme which generally speaking has not proven especially fruitful.</p>

<p>And then, of course, there are further groups of people who study ‘magic’ and ‘religion’ in an academic way, in terms of texts, traditions and practices, the construction of meaning, how stories evolve, and so on. <a href="https://www.youtube.com/@TheEsotericaChannel">Esoterica</a> is for us the iconic example. They may overlap with one or both of the previous categories; they may come at it from a place of skepticism or a place of asking fiddly theological questions in the tradition they were raised in. Maybe it’s just a Special Interest, for which no explanation is needed.</p>

<p>This hopefully suffices as a quick survey. We are not <em>exactly</em> going to be talking about that.</p>

<h3 id="a-magic-trick">a magic trick</h3>

<p>We can give you some information about a faraway place right now. In a certain place in Glasgow, on a warm, cloudy night of June 6 2026, there was a desk with a MIDI keyboard, VR headset controllers, roleplaying dice, a drawing tablet, a floppy disc which generates oscilloscope music, and a bookmark from Treadwell’s. Here, we took a picture:</p>

<figure>
	<img src="https://canmom.art/img/embed/wizardguide/desk.webp" alt="A photo of the items listed above." loading="lazy" />
    
	<figcaption>
		<p>Magical tools.</p>

		
	</figcaption>
    
</figure>

<p>Assuming you believe us, you didn’t receive the info by standing here in the room and looking with your eyes, did you? You remotely viewed a room, perhaps in another city or another continent. Whooooahhhhh spooky…</p>

<aside>if you <em>did</em> receive it by standing here in the room with me... aaahhh!!! hello!!! don't hurt me plx</aside>

<p>…you’re not very impressed by that, are you? This isn’t ‘magic’. It’s ‘technology’; ‘engineering’; ‘science’. That belongs to an entirely different category of thing. Doesn’t it?</p>

<p>Without really saying whether all of those other magical traditions ‘work’ or ‘don’t’ (to whatever end)… I want to teach you about a form of magic that definitely works. It is a form of magic that requires quite an alien way of thinking, like all good things—and yet we call it magic for this reason: it all really does come back to the fundamental magical act of <em>giving names to things that you cannot see</em>.</p>

<h2 id="where-it-came-from">where it came from</h2>

<p>Magic is a very tradition-bound thing. Even the radical (post)modernist traditions, such as Chaos Magic, are <em>traditions</em>. They are elaborations on something that came before.</p>

<p>The magic I want to teach you about today does not usually call itself magic. It calls itself a science. What exactly is a science?</p>

<p>The word ‘science’ traditionally just <a href="https://en.wiktionary.org/wiki/science#Usage_notes">meant</a> ‘scholarly’ study of something. In the mid-20th century, its sense narrowed to the ‘natural sciences’, ‘social sciences’ and perhaps the ‘formal sciences’, <small>though I’ll admit the first time I heard that last phrase was on Wiktionary just now</small>. These are quite wildly different disciplines, and the ‘demarcation problem’ of figuring out what is a ‘science’ and what isn’t has consumed a great deal of philosophical energy in the late 20th century. What are the typical characteristics of a ‘science’, though? A typical answer would probably cover features like formal rigour, statistical methods, skepticism and empiricism; you might get a bit of Popperian falsificationism and so on.</p>

<p>But this distinction is pretty modern. In the 16th and 17th centuries in Europe, the weirdos who pursued what we now call ‘science’ pursued all sorts of weird stuff with equal vigour.</p>

<p><a href="https://en.wikipedia.org/wiki/Isaac_Newton">Isaac Newton</a>, for example: his occupations included “mathematician, physicist, astronomer, alchemist, theologian, author and inventor”, a fellow who spent as much time writing about theology and alchemy as all the contributions to calculus, mechanics and optics that made him famous. (Dude also <a href="https://en.wikipedia.org/wiki/South_Sea_Company">invested in the slave trade</a>, which tends to get left out.) <a href="https://en.wikipedia.org/wiki/John_Dee">John Dee</a>: “mathematician, astronomer, teacher, astrologer, occultist, and alchemist”. He’s most famous for talking to angels through his buddy Edward Kelley and other such sorcerous things, but in his time he was also known as a navigation expert and pretty good at maths too. (Mathematicians never exactly <em>stopped</em> getting a bit funky with it, though the social significance of ‘thinking you can talk to angels’ changed by the time of <a href="https://en.wikipedia.org/wiki/John_Forbes_Nash_Jr.">John Nash</a>.)</p>

<p>Of course, over the ensuing centuries, the tradition of ‘natural philosophy’ diverged from these prior traditions. For example, some of these people <a href="https://en.wikipedia.org/wiki/Magnetism#History">took an interest</a> in some <a href="https://en.wikipedia.org/wiki/Lodestone#History">weird rocks</a> which like to point in certain directions and pull metals towards them, and similar effects that occur when you rub something sticky like amber, which led to this phenomenon being called ‘electricity’, which glosses to ‘amber-y-ness’.</p>

<p>Others stumbled on the strange fact that <a href="https://en.wikipedia.org/wiki/Luigi_Galvani#Animal_electricity">if you soak certain metals in salt water</a> in a special circular arrangement it can make a dead frog’s leg twitch. Before long <a href="https://en.wikipedia.org/wiki/Voltaic_pile">they figured out</a> special arrangements of metal bits in salt water which would do this weird frog/amber thing, whatever it is, more reliably and powerfully.</p>

<p>The alchemists <a href="https://en.wikipedia.org/wiki/Alchemy#Renaissance_and_early_modern_Europe">were hard at work through all this</a>, gradually sifting through all the different possibilities of mixing up bottles of <em>stuff</em> and heating, straining and filtering, trying to figure out what was made up of what, in a huge and very convoluted game—taking a very intricate occult tradition which had once concerned itself with the production of gold and finding instead all sorts of uses in medicine, mining and opportunities to defraud the rich.</p>

<p>To try to organise their understanding of all this weird shit, they had to come up with some theories. Maybe it would make sense to think the world is made up of a bunch of little things, let’s call them <a href="https://en.wikipedia.org/wiki/The_Sceptical_Chymist">corpuscules</a> of different types, and that these are better called ‘elements’ than, for example, Aristotle’s air, water, fire and earth? Maybe there is a substance, we could call it <a href="https://en.wikipedia.org/wiki/Caloric_theory">‘caloric’</a> in hot things, which likes to spread out? Maybe, in the voltaic pile, the ‘voltaic amber-y-ness’ produced by the stack of metal and salt water was the same thing as the ‘magnetic amber-y-ness’ produced by moving the aforementioned weird rock? Maybe there are two types of electrical thing, all mixed up with each other?</p>

<h3 id="interacting-with-entities">interacting with entities</h3>

<p>These days we cannot really view these as anything other than the steps towards modern science, but these ideas are all traditionally <em>magical</em> questions. ‘What is everything made of’, balances of ‘elements’, how can the sick be healed, and so on.</p>

<p>You cannot see the corpuscles, the caloric, and so on. You have to imagine that there are such things, work out a theory of what they would do if they were real, and if your theory is anywhere close, it will tell you how to fiddle with these invisible things and get a desired result. If it isn’t… think of something else. But you do have to go out on a limb of speculating about a ‘thing’ that is not <em>directly</em> accessible to the senses.</p>

<p>In fact, we now consider both theories to be obsolete, though they were along the right track. Boyle’s divisible ‘corpuscules’ <a href="https://en.wikipedia.org/wiki/Atomism#Atomism_and_corpuscularianism">anticipated</a> the modern theory of atoms, which turned out to be a bad name for things that can actually be divided after all… but chemistry does <em>act as if</em> there are corpuscules pretty well. The random jiggly motions of these atoms can be collectively described as representing something called ‘heat energy’, which in many circumstances <em>acts as if</em> it is a fluid.</p>

<p>Now, let’s draw some funny little symbols.</p>

\[\begin{aligned}\nabla \cdot \mathbf {E} \,\,\,&amp;={\frac {\rho }{\varepsilon _{0}}}\\\nabla \cdot \mathbf {B} \,\,\,&amp;=0\\\nabla \times \mathbf {E} &amp;=-{\frac {\partial \mathbf {B} }{\partial t}}\\\nabla \times \mathbf {B} &amp;=\mu _{0}\left(\mathbf {J} +\varepsilon _{0}{\frac {\partial \mathbf {E} }{\partial t}}\right)\end{aligned}\]

<p>There are two possibilities here: you have studied electromagnetism up to around undergraduate level, in which case you know that these are Maxwell’s laws in differential form, and what they mean… or, you haven’t, and if I said these shapes encode a description of ‘an energy field… (which) surrounds us and penetrates us. it binds the galaxy together’ (ok, that’s cheeky, I’d more likely say a pair of vector fields that exist at every point in space) you could only really be like ‘ok, sure…’, same as if I told you that you could summon a demon called Gaap by drawing this seal:</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep4/089-new-seal.png" alt="A Solomonic seal as depicted in Umineko." loading="lazy" />
    
	<figcaption>
		<p>The Goetic seal corresponding to Gaap in the <cite>Lesser Key of Solomon</cite>, as seen in <a href="/livereads/umineko/ep4/chapter-11"><cite>Umineko</cite></a>.</p>

		
	</figcaption>
    
</figure>

<p>If you know what to do with those equations—using an additional set of conceptual tools such as ‘vector calculus’, and a knowledge of the practices which can be used to identify and measure things like ‘electric charge’—you can use them to, for example, build an electric circuit. You don’t actually <em>need</em> to use them. You can build a radio, for example, perfectly well without ever doing vector calculus, just by building up a set of rules about which components go where. If you’re a radio engineer, you likely wouldn’t directly use these equations—doing a first-principles calculation from Maxwell’s laws would be fiddly and unhelpful.</p>

<p>Some day, however, you might want to ask <em>why</em> your radio works. Where do all these rules about transistors and capacitors and ‘electric currents’ come from? Why does “electricity” do any of that shit? And then you could work through the derivations of, for example, the <a href="https://en.wikipedia.org/wiki/Telegrapher%27s_equations">transmission line equations</a>. You could read up on the experiments that established electromagnetism, and maybe perform them yourself if you want to. You could learn about how weird it is that the resulting list of laws is ‘reference frame independent’, and how that led to thought experiments at the beginning of the 20th century which showed something is <em>very wrong</em> with the prior understanding of physics.</p>

<p>And, if you’re feeling especially daring, you could take it further: you could learn there is a ‘covariant form’ of Maxwell’s laws, for use in special relativity:</p>

\[\partial _{\alpha }F^{\alpha \beta }=\mu _{0}J^{\beta }\]

<p>If the last set of weird symbols was vexing, this one probably feels like it’s taking the piss. Why are some of the Greek letters up and others down? What does \(\partial_\alpha\) mean? (This is a nice efficient notation for doing relativity calculations. It is hopelessly esoteric for anyone but physicists and mathematicians, and even the mathematicians prefer other notations.)</p>

<p>You might go into learning about classical field theory, and Noether’s theorem. You might understand how this is really the <em>only</em> sort of vector field that would occur in a universe with Minkowski symmetry: this strange, seemingly arbitrary feature of our universe has a weird mathematical inevitability to it when we look at it from the right perspective… oh, we haven’t even touched on quantisation yet.</p>

<p>Which I think would be rather a delight to the Newtons of this world. It turns out, if you go looking for a mystical, abstract structure behind everything, with the right lens, with enough effort… well, maybe you actually find one. We call it <a href="https://en.wikipedia.org/wiki/Gauge_theory">‘gauge field theory’</a> and only people with postgraduate degrees, or commensurate effort without any institutional support, get to build up enough structures in their heads to understand it. Once you do, it’s really elegant though! …pretty fucked up, yeah.</p>

<p>Nevertheless, by pursuing this quest as an nth-degree recursive elaboration on that thing with the frog legs, we have found ways to create immense light and sound, travel at great speeds, speak to faraway people, move heavy objects, wash our clothes, warm and cool spaces, keep our food from spoiling, kill each other, and even occasionally revive the very recently dead. And we also figured out it’s a great way to build a “computer”, which is what the rest of this story is about.</p>

<p>But it’s not magic, right? If we found out “magic” was real it would be like… something else. Electromagnetism doesn’t have the right vibes, somehow.</p>

<p>What’s missing?</p>

<p>In many ways, the ‘magic’ we’ve described so far falls far short of what motivated the search. We can predict the celestial bodies, but it’s not actually much help in predicting the future on the scale of humans. It certainly doesn’t tell us how to live. Here in the middle, things are so damn complicated, and only get more so.</p>

<p>Why is that? A short answer: it’s because things like electromagnetism and chemistry form a substrate on which abstractions can live.</p>

<h2 id="what-is-a-computer">what is a computer</h2>

<p>OK so: surprise. This is actually an article about computers. We want to introduce you to <em>the magic that absolutely, unambiguously works</em>, and we want to do the unusual thing of presenting it <em>as</em> magic.</p>

<p>Imagine we lived in another universe with different physics. No Minkowski spacetime, no electromagnetism, none of the familiar chemicals. Perhaps it’s something like the world of <a href="https://unicornjelly.com/">Tryslmaistan</a>.</p>

<p>In such a universe, computers could at least potentially still exist. All sorts of things can be computers. A computer is not (necessarily) an electronic device; it is something altogether more abstract.</p>

<p>So what is a computer?</p>

<p>When we are first introduced to the concept of computers as children, we probably form an idea like this: a computer is a box with buttons and lights. It has a screen which shows you things, it makes sounds, and there are various things called ‘programs’ inside it. It can do an absolutely bewildering array of things and it also sometimes makes adults very annoyed when it doesn’t work.</p>

<p>A Victorian would say: a computer is someone, usually a woman, who works to draw up big tables of numbers for performing mathematical calculations. (For example, tables of logarithms can be used to quickly do multiplication.) By the beginning of the next century, a computer would become a <em>machine</em> which can be used to make calculations: for example, a ballistics computer on a ship could rapidly calculate integrals, derivatives and multiplications by <a href="https://en.wikipedia.org/wiki/Differential_analyser">rolling a ball on a specially shaped metal drum</a>.</p>

<p>We’re about to mention a bunch of concepts in quick succession. If they are of interest, we can elaborate later.</p>

<h3 id="a-little-history-tangent">a little history tangent</h3>

<p>If you’ve had much exposure to computer science in a traditional way, you might come up with a different story: there is this thing, a thought experiment rather than a real thing, which is called a <a href="https://en.wikipedia.org/wiki/Turing_machine">Turing machine</a>. It can perform ‘algorithms’ according to certain rules, which tell it to go up and down an arbitrarily long tape, reading and writing symbols at each point; by doing this, it is able to determine what other, simpler machines would do. A computer is a mechanical system which is, in a certain mathematical sense, ‘equivalent to’ a Turing machine: you can simulate a Turing Machine on it, and vice versa.</p>

<p>(Turing was a mathematician who created the machines which broke Nazi codes for the British government, and also thought <em>very</em> hard about things pretending to be other things until the government drove him to suicide with involuntary hormone therapy. You probably know that part.)</p>

<p>Turing did not invent computers, but alongside Alonzo Church and Kurt Gödel, who respectively invented the <a href="https://en.wikipedia.org/wiki/Lambda_calculus">lambda calculus</a> and <a href="https://en.wikipedia.org/wiki/General_recursive_function">general recursive functions</a> at almost exactly the same time, he came up with the theory which founds the discipline of magic we’re about to get stuck into. Church and Gödel were coming at it from a different angle, trying to understand the foundations of mathematics in terms of strings of symbols and procedures for manipulating them. Remarkably, it turned out that all three of their ideas were equivalent: a Turing machine can run the lambda calculus, and the lambda calculus can model a Turing machine.</p>

<p>This led to what we now call the <a href="https://en.wikipedia.org/wiki/Church%E2%80%93Turing_thesis">Church-Turing thesis</a> (sorry Gödel), which is that this is basically as good as it gets: roughly, if a Turing machine can’t do it, then nothing can. Since then, this is effectively the <em>definition</em> of a computer: if a system can be shown to be ‘Turing complete’, i.e. do whatever a Turing machine can, then it’s a computer.</p>

<p>You can at least in principle make a computer with e.g. <a href="https://en.wikipedia.org/wiki/Fluidics">water</a>, <a href="https://en.wikipedia.org/wiki/Domino_computer">dominos</a>, <a href="https://en.wikipedia.org/wiki/Optical_computing">laser beams</a> or billiard balls: generally the recipe is to find a way to make the system follow the logical rules we call a NOR gate (or NAND gate) and find a means to chain them together in succession. All these things are, however, generally slow as shit compared to electronic computers. (Optical computing might have a chance but that’s still electromagnetism.)</p>

<p>So, if not Turing, who <em>did</em> invent computers? Arguably someone in ancient Greece who made the <a href="https://en.wikipedia.org/wiki/Antikythera_mechanism">Antikythera mechanism</a>, a complex geared mechanical orrery. Tho, astonishing as it is, though, the Antikythera mechanism doesn’t meet Turing’s standard: it can’t do whatever a Turing machine can. The first person to conceptualise a machine which can do <em>that</em> might be Charles Babbage, who dreamed up (but never actually built) the <a href="https://en.wikipedia.org/wiki/Analytical_engine">Analytical Engine</a>.</p>

<p>But even Babbage didn’t quite know what he’d stumbled upon; his buddy the countess <a href="https://en.wikipedia.org/wiki/Ada_Lovelace">Ada Lovelace</a> went further in imagining some programs which the Analytical Engine might one day run. Lovelace is a fascinating figure, a self-described ‘analyst &amp; metaphysician’ who, as she worked to translate articles about it, speculated on how things like music might be encoded in the machine. (Perhaps if her Bernoulli number algorithm is the first computer program, these speculations could make her something like the first digital music producer?)</p>

<p>These four—Turing, Church, Babbage, and Lovelace—are some of the venerated figures of our strange practice, people who happened to be in the right time and place to come up with a really far-reaching idea or ten. Perhaps one day they will fade as deep into mythology as Paracelsus or Hermes Trismegistus. There are plenty of others more recent, we’ll learn about them in time.</p>

<p>All of it is a fascinating history… but it’s not actually very helpful to talk about Turing machines, right now. Without a lot of time trying stuff and intuition, it’s very hard to get a sense for what this thing with the tape can do.</p>

<p>It might as well be… magic.</p>

<p>We’d be better off starting with the computers we have in everyday life.</p>

<h3 id="whats-in-a-word">what’s in a word</h3>

<p>Programmers use the word ‘magic’ fairly often, in fact.</p>

<p>For example: the 1984 textbook <a href="https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs"><cite>Structure and Interpretation of Computer Programs</cite></a> depicts Hermes Trismegistus bestowing knowledge of the Lambda Calculus to Ramon Llull, adapted from <a href="https://archive.org/details/lemoyengeetlar02jaco/page/n53/mode/2up">a panel of alchemists</a> in the 1849 French history book <cite>Le Moyen Age et la Renaissance</cite>. Accordingly, it enjoyed a reputation as the ‘wizard book’ in hacker culture; if you understand its contents, people might joke that you belong to an esoteric order called the <a href="https://en.wikipedia.org/wiki/Knights_of_the_Lambda_Calculus">Knights of the Lambda Calculus</a>.</p>

<p>But in everyday hacker language, ‘magic’ is generally used in computing for things the speaker doesn’t want to explain in detail, perhaps because they are too complicated to understand. For example: ‘then the compiler does some magic to optimise this away’. A particularly inscrutable algorithm might be described as ‘black magic’, or even <a href="https://en.wikipedia.org/wiki/Fast_inverse_square_root">‘evil’</a>. This use is largely unchanged <a href="https://www.dourish.com/goodies/jargon.html">from 1988’s jargon file</a>:</p>

<blockquote>
  <p>MAGIC adj. 1. As yet unexplained, or too complicated to explain. (Arthur C. Clarke once said that magic was as-yet-not-understood science.) “TTY echoing is controlled by a large number of magic bits.” “This routine magically computes the parity of an eight-bit byte in three instructions.” 2. (Stanford) A feature not generally publicized which allows something otherwise impossible, or a feature formerly in that category but now unveiled. Example: The keyboard commands which override the screen-hiding features.</p>
</blockquote>

<p>Under this sense, things stop being magic once you understand them. Understanding the inner workings of a system <a href="https://www.youtube.com/watch?v=3V-6TXwm2XI">might be compared</a> to understanding the trick behind a piece of stage magic.</p>

<p>This is somewhat contrary to depictions of magic as something that you <em>study</em>. It’s also a bit different from the account of magic we’re using here. To understand magic, for us, is to build up a structure in your head which can hold it.</p>

<p>In short, we want to help you understand and wield the magic. Whether that means it stops being magic depends on what you call magic.</p>]]></content><author><name></name></author><category term="programming" /><category term="magic" /><category term="programming grimoire" /><summary type="html"><![CDATA[Before we talk about computers, we must talk about the world that contains computers.]]></summary></entry><entry><title type="html">programming grimoire [1]::are programs real?</title><link href="https://canmom.art/programming/magic/1-programs" rel="alternate" type="text/html" title="programming grimoire [1]::are programs real?" /><published>2026-06-07T00:00:00+00:00</published><updated>2026-06-07T00:00:00+00:00</updated><id>https://canmom.art/programming/magic/1-programs</id><content type="html" xml:base="https://canmom.art/programming/magic/1-programs"><![CDATA[<p>In the previous article we have set the scene with a little dash around the history of ‘magic’ and ‘science’, talking about how the latter emerged out of the former. We learned a little about how electromagnetism was divined to be this universe’s magic, and then we said it gets rather complicated on the scale of us humans, because it is a ‘substrate for abstractions’. Then we gave some obeisances to the founders of our order.</p>

<p>All of that is ‘just’ context.</p>

<p>It’s time to get to it. We would like you to understand <em>what programs are</em>, and what it means to write them.</p>

<ol id="markdown-toc">
  <li><a href="#what-is-a-program" id="markdown-toc-what-is-a-program">what is a program?</a>    <ol>
      <li><a href="#instructions" id="markdown-toc-instructions">instructions</a></li>
      <li><a href="#the-wider-world" id="markdown-toc-the-wider-world">the wider world</a></li>
      <li><a href="#a-home-for-programs" id="markdown-toc-a-home-for-programs">a home for programs</a></li>
      <li><a href="#programs-in-boxes" id="markdown-toc-programs-in-boxes">programs in boxes</a></li>
      <li><a href="#so-do-programs-exist" id="markdown-toc-so-do-programs-exist">so do programs exist?</a></li>
    </ol>
  </li>
  <li><a href="#first-orb-to-ponder" id="markdown-toc-first-orb-to-ponder">first orb to ponder</a></li>
</ol>

<h2 id="what-is-a-program">what is a program?</h2>

<p>A modern computer is generally speaking doing a lot of ‘things’ at once. We tend to call these ‘things’ processes or programs. You can find out what your computer is doing in a few ways.</p>
<ul>
  <li>on Linux, you’ve got lots of options. I suggest running <code class="language-plaintext highlighter-rouge">btop</code> (you may need to install it; <code class="language-plaintext highlighter-rouge">htop</code> or <code class="language-plaintext highlighter-rouge">top</code> are older, slightly less fancy-looking alternatives). Or, see if your desktop environment has program called something like ‘System Monitor’.</li>
  <li>on Windows, open the Task Manager.</li>
  <li>on macOS, open the Activity Monitor.</li>
  <li>on an Android device, it’s annoyingly fiddly to get this information. You have to do a <a href="https://developer.android.com/studio/debug/dev-options">weird ritual</a> to turn on developer options by tapping seven times on the build number (no seriously), then you can open ‘Running services’ in the developer options</li>
  <li>on a FreeBSD computer, an Amiga, or one of the many other operating systems… if you’re using one of these, you probably know already.</li>
</ul>

<p>Once you’re in there, there will be a long list of mysterious things that are being done by your computer. So what are they?</p>

<p>Well, let’s start by saying programs kinda don’t actually exist… at least, ‘below certain levels of abstraction’.</p>

<h3 id="instructions">instructions</h3>

<p>Every modern computer processes things we call ‘instructions’. There is a long list of things that a particular computer knows how to do, each of which has a number.</p>

<p>We’re starting somewhere in the middle of the great chain of abstractions that makes up a computer. We could start lower, with logic gates; we are going to build higher. But starting with instructions is a nice place to get a sense for how things really work.</p>

<p>None of this is stuff you need to memorise: we will deal with this indirectly, through programs.</p>

<p>“Inside” the computer somewhere there “is” a long list of instructions we want it to carry out, not unlike a recipe. We can represent it like this, in “machine code”. For example, here is some code for an x86-64 processor that reads two numbers and adds them together:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>89 7c 24 0c
89 74 24 10
01 fe
</code></pre></div></div>
<p>You can read this as saying ‘run instruction 0x89 with the values 0x7c, 0x24, and 0x0c, then run instruction 0x89 with the values 0x74, 0x24 and 0x10, then run instruction 0x01 with the value 0xfe’. (The prefix 0x… means the values are all written in <a href="https://en.wikipedia.org/wiki/Hexadecimal">hexadecimal</a>.)</p>

<p>Nobody in their right mind would try to make sense of a program this way (nobody was in their right mind in the 40s, least of all the people who invented computers), so in 1947 Kathleen and Andrew Donald Booth invented the first <a href="https://en.wikipedia.org/wiki/Assembly_language">assembly language</a> and gave all these numbers special names to make it more readable. With x86-64 assembly, the above reads:</p>

<pre><code class="language-asm">mov    DWORD PTR [rsp+0xc],edi
mov    DWORD PTR [rsp+0x10],esi
add    esi,edi
</code></pre>
<p>which can be read as: ‘move the thirty-two-bit value from the memory address at (stack pointer + 0x0c) into the edi register, then move the thirty-two bit value from the memory address at (stack pointer + 0x10) to the esi register, then add the esi and edi registers together, storing the result in the esi register’. A program called an assembler can turn this special language into the numbers above.</p>

<p>That’s still very complicated, nearly every word in that sentence is jargon! However, this is what computers are actually <em>doing</em>. All the electronics that exists in a computer, all the logic gates and transistors, have been very carefully put together in order to make it possible to decode and run these instructions. Everything <em>else</em> we are going to do will ultimately be boiled down into instructions like this.</p>

<p>Different types of computers have different <em>instruction sets</em>. A modern PC will almost certainly be running x86-64; an android phone or Apple computer will almost certainly be running some variant of ARM. A small, embedded device might be running RISC-V. Older computers ran lots of other architectures. In theory, it is actually possible to make <a href="https://en.wikipedia.org/wiki/One-instruction_set_computer">a computer with just one instruction</a>, such as subleq.</p>

<p>In no case do the instructions have any notion of what program they are associated with. So where do programs come into it?</p>

<h3 id="the-wider-world">the wider world</h3>

<p>Single instructions on their own are not good for very much. We added two numbers together, so what? We need some other instructions to come together and read that number we just calculated, and do something with the result. By feeding the results of one instruction into another instruction, we get complicated behaviour. A modern computer might run a few billion instructions in a second.</p>

<p>By arranging a whole bunch of instructions just so, we can describe a process to achieving some desired result. For example, a very basic program could ask you for two numbers on the screen, and then add them together, and then put the result on the screen. This analogises pretty well to a ‘magic working’. You have some intent, and you arrange a bunch of symbolic elements to create a process that will fulfill that intent.</p>

<p>Hold on a minute, where did this screen come from? This is a new character in our story, isn’t it?</p>

<p>So far we’ve talked about the inside of a CPU in isolation. But a CPU on its own is just an unbelievably expensive paperweight. A modern computer has a whole bunch of parts. At absolute minimum, to be useful we need: motherboard, CPU, memory, and some kind of connection to the ‘outside world’. This could be a screen (for a desktop PC or phone), but it could just be a network connection (for a server), or a motor (for an embedded microcontroller), or some other weird thing.</p>

<p>So, using various protocols, the CPU that is carrying out our program has some way ‘talk to’ the other parts.</p>

<p>The memory may be the most important. Inside the CPU there is only a very, very small amount of space to store information. Anything that needs to stick around needs to go into memory. Many different types of physical electric circuit can qualify as memory, but the important thing is that it is ‘random access’, meaning the CPU can look up or store a value anywhere, given just a number which we call an <dfn>address</dfn>. The CPU activates wires (circuit board traces) called the ‘address lines’ to send a signal to the memory controller, which looks up that address, and sends back the contents.</p>

<p>What about the connection to the outside world? Well, the motherboard’s job is to take signals from the CPU and decide what to do with them. There are various ways this can be accomplished. It may simply be accomplished with the same ‘write to memory’ instruction, but for certain addresses, the motherboard jumps in and says ‘actually <em>that</em> address means we need to pass this data <em>here</em>’. Or there might be special lines and special instructions just for talking to hardware.</p>

<p>In the old days, you would have a manual that comes with your computer and tells you what you need to do to interact with the other components. In those days, a computer would just run <em>one</em> program.</p>

<p>Nowadays, there are millions of different configurations of computer your display might want to run on. You don’t want to know about all the details. You probably also want to run multiple programs at once. This is where the operating system comes in.</p>

<h3 id="a-home-for-programs">a home for programs</h3>

<p>The <dfn>operating system</dfn> is, roughly, the program which runs all the other programs. It provides a context in which programs can ‘talk to’ each other in standardised ways.</p>

<p>Some of those programs control ‘talking to the hardware’, and it will have specialist programs for all the different types of hardware that it might run on, which we tend to call ‘drivers’. This is nice because <em>you</em> can just write a program to target a specific operating system, which has just one standard way of doing things. For example, if you want to play a sound, a program can ask the operating system to translate your ‘please play a sound for me’ command into device-specific instructions for the <em>particular</em> sound hardware of <em>this</em> computer.</p>

<p>How do you have all these programs running at once? You sorta don’t. On a single-core CPU, it’s like this: you run a little bit of one program, then you put the state of that program into memory and jump to where you left off on another program, and then again for the next program… This is called <a href="https://en.wikipedia.org/wiki/Computer_multitasking">multitasking</a>. The process of putting one program away, and loading another to execute for a little while, is called a ‘context switch’.</p>

<p>So the distinction between different programs lives in the operating system. The operating system becomes the ‘environment’ in which other programs frolic. But to the CPU, the operating system and the programs inside it are all combined into one huge, non-stop stream of instructions.</p>

<h3 id="programs-in-boxes">programs in boxes</h3>

<p>Within an operating system you have the idea of a thing called a ‘file’, which is really at the most fundamental level just a name which the programs can interact with. Usually, that name refers to a chunk of data. And usually, it will have some extra information which will help the operating system figure out what program might understand this file, called ‘metadata’. But other ‘things’ can be ‘files’ too. On Linux (and other Unix-derived systems), all sorts of things can be spoken to as files, including hardware devices, running programs, random number generators…</p>

<p>Still, sticking with the familiar: if a file is ‘just a bunch of data’, one type of file is an ‘executable file’. This is a file containing instructions, like we’ve discussed above. Different operating systems have different ways to format this file. On Linux, files are elves… sorry, they are <a href="https://en.wikipedia.org/wiki/Executable_and_Linkable_Format">ELF binaries</a>. On Windows, they are some version of <a href="https://en.wikipedia.org/wiki/.exe">exe</a>. On Android, it’s an <a href="https://en.wikipedia.org/wiki/Apk_(file_format)">APK</a>, and so on.</p>

<p>Whatever they are, they store the recipe of instructions that ‘belong to’ one particular program. Besides conforming to the format, there is nothing special going on here. It’s pile of data, the same as an image or video or anything else. Without knowing how to read it, most of the contents would look like random noise. But the operating system knows how to decode it: it copies the program’s instructions into memory, makes a note of this program amidst the list of running programs, and jumps the CPU to the beginning to start doing whatever the program tells it to do.</p>

<h3 id="so-do-programs-exist">so do programs exist?</h3>

<p>What we’ve described so far is <em>how an abstraction becomes real</em>.</p>

<p>We want to imagine there are lots of little things, which we call programs, running inside the computer. If that were the case, we can conclude that they ought to behave in certain ways. So we wrote a program that follows those rules.</p>

<p>If we did our job right, if we cover all the little details, then we get a situation <em>as if</em> the world inside the computer is segmented into little things, which can be passed around as files, and each one is running on its own and passing little signals to the others.</p>

<p>This is how we perform magic. We work out what we want to happen, and make something on the ‘level below’ conform to the rules. In computers, there is only ever <em>as if</em>. We build <em>as if</em> on top of <em>as if</em> on top of <em>as if</em> until the stack of abstractions is so tall we can hardly see the bottom anymore. We can build entire notional computers on ‘as if’, which we call ‘virtual machines’; in theory it should be impossible for a program to know that it is running on a virtual machine as opposed to ‘directly on the hardware’. (In practice there are subtle ways to tell.)</p>

<p>Sometimes the abstraction fails. For example, one ‘as if’ that we want to enforce is that programs have different levels of security privilege. The ‘kernel’ is allowed to do things that ‘user space’ programs cannot. The ‘user space’ programs must ask nicely for the kernel to do something, like give it some memory, and before it does, the kernel will check to make sure all the relevant rules are being followed. For example, I can’t just snoop around for sensitive information that other programs might be processing.</p>

<p>But if there is a mistake in how the kernel is written, I might be able to trick it into doing something it wasn’t designed to do, take control, and do whatever I want: steal information, impersonate people, etc. Computers are really horny to compute. Computational power can sneak through all sorts of weird ways. Later on we might learn about things like ‘ROP gadgets’ and ‘weird machines’, where fully Turing-complete computers form inside programs more or less by accident.</p>

<p>This is known as the abstraction <a href="https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/">‘leaking’</a>. It is not enough to know what ‘as if’ rules a program is following. A complete story describes both the intent of the program and where the reality differs from the intent.</p>

<h2 id="first-orb-to-ponder">first orb to ponder</h2>

<p>Later in this series we might pose multiple-choice questions. However, I don’t think this stage needs it. Instead, some things to think about.</p>

<p><code class="language-plaintext highlighter-rouge">ffmpeg</code> is a program which does things with video and audio. You can run <code class="language-plaintext highlighter-rouge">ffmpeg</code> on many different platforms: Windows, Linux, etc., and many different architectures, and there are many different versions.</p>

<p>Conventionally, we tend to think of some portion of these as mostly being ‘the same program’. But what makes that the case? Perhaps we can think of…</p>

<ul>
  <li>two running instances of <code class="language-plaintext highlighter-rouge">ffmpeg</code> were loaded from the same file on disk</li>
  <li>two files of <code class="language-plaintext highlighter-rouge">ffmpeg</code> have the exact same bits, but they’re ‘different files’</li>
  <li>as a library, two versions of <code class="language-plaintext highlighter-rouge">ffmpeg</code> can be shown to give the same output for (nearly) all inputs, but they have different symbols for linking to other programs</li>
  <li>two files of <code class="language-plaintext highlighter-rouge">ffmpeg</code> were compiled from the same source code</li>
  <li>two different files are launched with the same <code class="language-plaintext highlighter-rouge">ffmpeg</code> console command (they have the same name in the operating system), e.g. before and after an update</li>
</ul>

<p>Now imagine changing these things. Maybe you rename it to <code class="language-plaintext highlighter-rouge">ffmpreg</code>. Maybe you modify the source and recompile it, maybe you rewrite it from scratch but somehow do such a good job it does the exact same thing.</p>

<p>Which ones are still ‘the same as’ ffmpeg? There isn’t a right answer.</p>]]></content><author><name></name></author><category term="programming" /><category term="magic" /><category term="programming grimoire" /><summary type="html"><![CDATA[When we say a program is running on a computer, what are we even talking about?]]></summary></entry><entry><title type="html">programming grimoire [2]::naming things into existence</title><link href="https://canmom.art/programming/magic/2-naming" rel="alternate" type="text/html" title="programming grimoire [2]::naming things into existence" /><published>2026-06-07T00:00:00+00:00</published><updated>2026-06-07T00:00:00+00:00</updated><id>https://canmom.art/programming/magic/2-naming</id><content type="html" xml:base="https://canmom.art/programming/magic/2-naming"><![CDATA[<p>Having learned what a program is, it’s time we made one.</p>

<ol id="markdown-toc">
  <li><a href="#getting-set-up-introducing-rust" id="markdown-toc-getting-set-up-introducing-rust">getting set up (introducing Rust)</a>    <ol>
      <li><a href="#the-console" id="markdown-toc-the-console">the console</a></li>
      <li><a href="#setup-and-compilation" id="markdown-toc-setup-and-compilation">setup and compilation</a></li>
    </ol>
  </li>
  <li><a href="#naming-things" id="markdown-toc-naming-things">naming things</a></li>
  <li><a href="#semantics-vs-instructions" id="markdown-toc-semantics-vs-instructions">semantics vs instructions</a>    <ol>
      <li><a href="#shadowing" id="markdown-toc-shadowing">shadowing</a></li>
      <li><a href="#mutable-variables" id="markdown-toc-mutable-variables">mutable variables</a></li>
    </ol>
  </li>
  <li><a href="#what-is-a-language-for" id="markdown-toc-what-is-a-language-for">what is a language for?</a></li>
  <li><a href="#a-dungeon-game" id="markdown-toc-a-dungeon-game">a dungeon game</a></li>
  <li><a href="#second-orb-to-ponder" id="markdown-toc-second-orb-to-ponder">second orb to ponder</a></li>
</ol>

<h2 id="getting-set-up-introducing-rust">getting set up (introducing Rust)</h2>

<p>That’s probably enough preamble. Why don’t we actually do a little programming?</p>

<p>For this series, we will be using the Rust programming language. Instructions for installing it are <a href="https://rust-lang.org/learn/get-started/">here</a>.</p>

<p>Although Rust has a very helpful and informative compiler, we also recommend having a good IDE with <em>language server</em> support. Like all programmers we have <em>opinions</em>. We currently use <a href="https://zed.dev/">Zed</a>, but for the love of Lain, please turn off AI in the settings. A traditional console-based option is <a href="https://www.vim.org/">Vim</a>, or more recently <a href="https://neovim.io/">Neovim</a>; alternatively <a href="https://www.gnu.org/software/emacs/">emacs</a>. (In times past, the choice of vim or emacs was so fervently argued it was often called ‘religious debate’.) If you dislike Zed, <a href="https://www.sublimetext.com/">Sublime</a> is still pretty good and importantly very fast, but its language server support is less good. We won’t recommend anything that is built in Electron (VSCode etc.) even though most people use them. You might feel less strongly about it.</p>

<p>Speaking of religious debate, why Rust? We (canmoms) like Rust. It’s a language that, in our view, strikes a good balance. It is a compiled language, so you will make the actual sort of programs that run on your computer. It doesn’t have as many fiddly annoying aspects as older languages like C, but it will still give you a firm foundation to understand what both ‘high-‘ and ‘low-level’ languages are doing. For the sake of teaching, it is a very explicit language, and accords nicely with the ways that we like to think about programming. In particular, it has a very nice type system. It is also very fast to run (but relatively slow to compile).</p>

<p>Not everyone would agree. People get quite fervent about this. The main complaint people make about Rust is that it is overcomplicated; it also has a very strict model for handling memory which people sometimes find overly restrictive. This is one reason why suggesting starting with Rust, which is infamously quite difficult, is maybe a bit spicy. Later in this series, we’ll talk about some of the design tradeoffs that Rust makes, and compare other languages.</p>

<p>A great deal of this series will be conceptual enough that it will apply to any programming language. If we start talking about a specific Rust feature we will make sure to be clear about it.</p>

<p>This is not a complete guide to the syntax of Rust. For that, there is the <a href="https://doc.rust-lang.org/book/title-page.html">Rust book</a>. This is an excellent and well-written resource if you already know a little about programming, but it is quite heavy going.</p>

<h3 id="the-console">the console</h3>

<p>In the olden days, computers just gave you text-based ‘terminals’. You would type commands, and the results would be printed as text.</p>

<p>In modern times we still tend to use ‘terminal emulators’, also known as ‘consoles’, for programmy activities. The idea is the same: you type the name of a program, and some settings for it, and it will run.</p>

<p>On Linux, there are lots of options depending on your distro, desktop environment etc. but you can probably find yours just by searching for ‘console’ or ‘terminal’. On MacOS, it’s just called Terminal.</p>

<p>On Windows, you have the ‘command prompt’ which is old, and ‘PowerShell’ which is newer. Out of the box, powershell is a rather unfetching shade of blue. We recommend using <a href="https://scoop.sh/">scoop</a> to install <a href="https://github.com/lukesampson/concfg">concfg</a> to make it less painful to look at. With scoop you can get things feeling a little more comfortable.</p>

<p>On the layer just inside the window, there are lots of different “shells” which work in slightly different ways (bash, fish, powershell etc.) which determine what actual text you’ll see and what commands are available. The most important piece of information is that your shell is ‘somewhere’: it has a ‘working directory’ inside the operating system’s ‘file system’. Whenever you run a command it will take this ‘location’ into account. On most consoles, you can change to other locations with the <code class="language-plaintext highlighter-rouge">cd</code> command, and see what is present where you are with <code class="language-plaintext highlighter-rouge">ls</code>. <code class="language-plaintext highlighter-rouge">.</code> is a shortcut for where you are right now, and <code class="language-plaintext highlighter-rouge">..</code> is a shortcut for the layer containing where you are, so <code class="language-plaintext highlighter-rouge">cd ..</code> will take you out of your current folder.</p>

<p>There’s a lot of other stuff but that’s all you need to get started.</p>

<h3 id="setup-and-compilation">setup and compilation</h3>

<p>Create a new folder. In the console navigate to this folder and type the incantation <code class="language-plaintext highlighter-rouge">cargo init</code>. This will run a program called Cargo, which is the Rust package manager, and tell it to set up a new project for us. Cargo will create some files: a <code class="language-plaintext highlighter-rouge">Cargo.toml</code> file which contains some general settings for the project, a <code class="language-plaintext highlighter-rouge">src</code> folder, and inside there a <code class="language-plaintext highlighter-rouge">main.rs</code> file to contain our program.</p>

<p>Together, these files define what sort of program is to be built. The program that turns them into an actual executable file of the sort we discussed above is called the <em>compiler</em>. Compilers are one of the greatest things humans have ever invented, maybe. They’re certainly one of the richest, most intricate segments of computer science.</p>

<p>To turn our program into an executable file, we should type <code class="language-plaintext highlighter-rouge">cargo build</code> into the console. This compiles the program without optimisations under <code class="language-plaintext highlighter-rouge">target/debug</code>; alternatively, casting <code class="language-plaintext highlighter-rouge">cargo build --release</code> will create a faster, optmised version under <code class="language-plaintext highlighter-rouge">target/release</code>. You can also build and immediately run a program with <code class="language-plaintext highlighter-rouge">cargo run</code>. <code class="language-plaintext highlighter-rouge">cargo</code> will not bother rebuilding if nothing has changed.</p>

<p>If there is a compilation error in your program, the compiler will not create a new executable file, and will give you information about the error, and hopefully some advice on how to fix it, in the console when you type <code class="language-plaintext highlighter-rouge">cargo build</code> or <code class="language-plaintext highlighter-rouge">cargo run</code>.</p>

<p>OK, that’s the basic set of incantations. Let’s see what we can do with them.</p>

<h2 id="naming-things">naming things</h2>

<p>There’s an old computer science joke which goes like this:</p>

<blockquote>
  <p>The two hard problems of computer science are naming things, cache invalidation, and off-by-one errors.</p>
</blockquote>

<p>It apparently goes back to <a href="https://www.karlton.org/2017/12/naming-things-hard/">Phil Karlton</a>, according to his son. At some point the meta joke of adding ‘off-by-one errors’ was added. Who knows who came up with that one.</p>

<p>Cache invalidation is an interesting and genuinely fiddly engineering problem which we will not explain just yet; the other two are funny jokes, right? Like, yeah, it’s kinda important to come up with good names for things, but at the end of the day it doesn’t matter <em>that</em> much. They’re easy to replace with modern tools. And off-by-one errors are just a common type of accidental slipup.</p>

<p>But actually…</p>

<p>The very first thing you will probably be taught to do in any programming tutorial is “assign a variable”. Let’s go ahead and do that right now.</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">some_number</span> <span class="o">=</span> <span class="mi">1337</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Ignore for now the <code class="language-plaintext highlighter-rouge">fn main() {...}</code> wrapper, we’ll talk about that later, it just tells our program where to start.</p>

<p>The line breaks down…</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">let</code> says we are about to name something</li>
  <li><code class="language-plaintext highlighter-rouge">some_number</code> is the name we are bestowing</li>
  <li><code class="language-plaintext highlighter-rouge">=</code> says we are assigning a value to this name</li>
  <li><code class="language-plaintext highlighter-rouge">1337</code> is the value we are assigning</li>
  <li><code class="language-plaintext highlighter-rouge">;</code> ends the expression/statement (in Rust, everything is an expression)</li>
</ul>

<p>If we compile and run this program it won’t do anything. (You will get a warning about an unused variable too.) But we have nevertheless expressed a desire in the language’s syntax: we have said we wish for something to exist, and we have given that ‘thing’ a name. That name is <code class="language-plaintext highlighter-rouge">some_number</code>. We have also stored a <dfn>value</dfn> behind this name. This is the integer 1337.</p>

<p>What has actually happened, though? According to the language’s <em>semantics</em>, all that we have declared is that we want the name <code class="language-plaintext highlighter-rouge">some_number</code> to exist, and that it should contain the value 1337. This means, if, later in the program, we write <code class="language-plaintext highlighter-rouge">some_number</code> in a place where a name is expected, it can be replaced by the number 1337.</p>

<p>Where in the computer is the number 1337 <em>actually</em> stored? Logically, it is a place called the ‘stack’, but the compiler has some freedom here: maybe it will store this in a CPU register, maybe it will put it in memory.</p>

<p>Alternatively, as in this case, it will actually determine that we never look for the contents of the name <code class="language-plaintext highlighter-rouge">some_number</code>, so it can safely be deleted from the program. After the compiler’s done its work, the value 1337 won’t even appear anywhere.</p>

<p>We can add some special magic to the program to tell it to contact the operating system and write to the console.</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">some_number</span> <span class="o">=</span> <span class="mi">1337</span><span class="p">;</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"some_number = {}"</span><span class="p">,</span> <span class="n">some_number</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>What does <code class="language-plaintext highlighter-rouge">println!</code> mean? This is a Rust standard library “macro” which is actually doing quite a lot under the hood. It is saying: ‘format’ a string, then ask the operating system to write it out to the console. ‘Formatting’ a string involves filling in the gaps where we’ve written <code class="language-plaintext highlighter-rouge">{}</code> with values from our program. There are lots of different ways to format things, but that would be a distraction.</p>

<p>For now, I will just say this: this is a piece of prebuilt machinery, a spell which Rust provides us. Later, we will certainly find out what’s going on under the hood; for now, we really need to see something come out of our program so we will have to leave it unexplained. This is the simplest way to build up some other ideas.</p>

<p>All you need to know then: you can write <code class="language-plaintext highlighter-rouge">println!</code> followed by something in parantheses. The first line must always be a template, wrapped in quotes, <code class="language-plaintext highlighter-rouge">"like so"</code>. Any place you put <code class="language-plaintext highlighter-rouge">{}</code> in the template, you can then put a value from the list that comes after. The first value goes in the first <code class="language-plaintext highlighter-rouge">{}</code>, the second value in the second <code class="language-plaintext highlighter-rouge">{}</code>, and so on. (You can actually put additional information inside the <code class="language-plaintext highlighter-rouge">{}</code> to make it print it in certain ways, such as <code class="language-plaintext highlighter-rouge">{:09}</code> to print a 9-digit long number padded with zeroes; I won’t explain that right now but if you are dying to know about it there is information <a href="https://doc.rust-lang.org/std/fmt/">here</a>.) Try playing around a bit with <code class="language-plaintext highlighter-rouge">println!</code> templates.</p>

<h2 id="semantics-vs-instructions">semantics vs instructions</h2>

<p>What we are observing here is that, unlike the assembly language we saw earlier, a Rust program doesn’t correspond to machine code in a simple way at all. The compiler takes our program and spits out some machine code which ‘matches up with’ what we wanted the program to do.</p>

<p><a href="https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:rust,selection:(endColumn:1,endLineNumber:5,positionColumn:1,positionLineNumber:5,selectionStartColumn:1,selectionStartLineNumber:5,startColumn:1,startLineNumber:5),source:'pub+fn+main()+%7B%0A++++let+some_number+%3D+1337%3B%0A++++println!!(%22some_number+%3D+%7B%7D%22,+some_number)%3B%0A%7D%0A'),l:'5',n:'0',o:'Rust+source+%231',t:'0')),k:47.45547073791349,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:r1950,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1',verboseDemangling:'0'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:1,lang:rust,libs:!(),options:'-C+opt_level%3D2',overrides:!((name:edition,value:'2024')),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+rustc+1.95.0+(Editor+%231)',t:'0')),k:52.54452926208651,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4">Using Compiler Explorer</a>, we can actually see exactly what comes out of the compiler. With some knowledge and effort, it’s possible to line things up, but actually most of this code is just setting up to run <code class="language-plaintext highlighter-rouge">println!</code> for us.</p>

<p>So what’s going on? How should we understand this?</p>

<p>A Rust program does not describe machine code, exactly. It describes what an ‘abstract machine’ should do. The code generated by the compiler ‘matches up’ in the following way: for a given input, the program is obliged to result in certain things where it touches the ‘outside world’. In this case, there are no inputs (or are there…), so the compiler <em>must</em> have the program print the number 1337 to the console. How it actually goes about doing that is its business.</p>

<aside>There actually is an input: the program has to be told <em>where</em> it can write things, such as the number 1337, by the operating system. However, that is hidden away, and we don't deal with that directly.</aside>

<p>If you write <code class="language-plaintext highlighter-rouge">let some_number</code> you’re saying that the compiler should know about this name, which we call <dfn>declaring</dfn> an <dfn>identifier</dfn>. Then the <code class="language-plaintext highlighter-rouge">= 1337</code> is performing <dfn>assignment</dfn>: we are associating that name with a value.</p>

<p><small>Note that this is not the same as asserting there is a mathematical equality, it’s not like an algebraic equation, despite using the same ‘equals’ sign. Assignment in this type of language is an <em>action</em>: the thing on the right is <em>put inside</em> the thing on the left. There is a before, where the equality might not be true, and an after, where it is. Some languages might use a different syntax like <code class="language-plaintext highlighter-rouge">some_number &lt;- 1337</code>. But Rust follows the tradition of C-like languages in which a single <code class="language-plaintext highlighter-rouge">=</code> always means assignment.)</small></p>

<p>A Rust program describes a series of statements about how we want things in the abstract machine to change. For example, let’s add some numbers…</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">leet</span> <span class="o">=</span> <span class="mi">1337</span><span class="p">;</span>
    <span class="k">let</span> <span class="n">acab</span> <span class="o">=</span> <span class="mi">1312</span><span class="p">;</span>
    <span class="k">let</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">leet</span> <span class="o">+</span> <span class="n">acab</span><span class="p">;</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"{} + {} = {}"</span><span class="p">,</span> <span class="n">leet</span><span class="p">,</span> <span class="n">acab</span><span class="p">,</span> <span class="n">sum</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>We are assigning ‘the result of adding 1337 and 1312’ to the identifier ‘sum’. At the end we’ve got a line which prints out all that stuff we declared, slotting it into the designated boxes in a sentence template.</p>

<p>One intresting wrinkle of this is that the state of things is different on each line of the program. Let’s try printing out the value of <code class="language-plaintext highlighter-rouge">sum</code> before we’ve declared it…</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">leet</span> <span class="o">=</span> <span class="mi">1337</span><span class="p">;</span>
    <span class="k">let</span> <span class="n">acab</span> <span class="o">=</span> <span class="mi">1312</span><span class="p">;</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"sum: {}"</span><span class="p">,</span> <span class="n">sum</span><span class="p">);</span>
    <span class="k">let</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">leet</span> <span class="o">+</span> <span class="n">acab</span><span class="p">;</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"{} + {} = {}"</span><span class="p">,</span> <span class="n">leet</span><span class="p">,</span> <span class="n">acab</span><span class="p">,</span> <span class="n">sum</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>In your IDE, or if you try to compile, you should get a red squiggly line under ‘sum’, and it will say:</p>

<blockquote>
  <p>error[E0425]: cannot find value <code class="language-plaintext highlighter-rouge">sum</code> in this scope</p>
</blockquote>

<p>On this line of the program, <code class="language-plaintext highlighter-rouge">sum</code> does not exist. It only exists after we declare it. But what’s all this about scope?</p>

<p>In Rust, curly braces do something quite special. They create a kind of mini world in which the names we give are allowed to live. Let’s give it a try. (We have added comments, lines of code which do nothing, by writing <code class="language-plaintext highlighter-rouge">//</code> at the start of each one.)</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">leet</span> <span class="o">=</span> <span class="mi">1337</span><span class="p">;</span>
    
    <span class="c1">//scope begins here</span>
    <span class="p">{</span>
        <span class="k">let</span> <span class="n">acab</span> <span class="o">=</span> <span class="mi">1312</span><span class="p">;</span>
        
        <span class="c1">//this will not give an error</span>
        <span class="k">let</span> <span class="n">foo</span> <span class="o">=</span> <span class="n">acab</span><span class="p">;</span>

        <span class="c1">//this is fine too</span>
        <span class="k">let</span> <span class="n">bar</span> <span class="o">=</span> <span class="n">leet</span><span class="p">;</span>

        <span class="c1">//scope ends here</span>
    <span class="p">}</span> 
    
    <span class="c1">//this will give an error</span>
    <span class="k">let</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">leet</span> <span class="o">+</span> <span class="n">acab</span><span class="p">;</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"{} + {} = {}"</span><span class="p">,</span> <span class="n">leet</span><span class="p">,</span> <span class="n">acab</span><span class="p">,</span> <span class="n">sum</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Inside the inner pair of braces, we define the names <code class="language-plaintext highlighter-rouge">acab</code>, <code class="language-plaintext highlighter-rouge">foo</code> and <code class="language-plaintext highlighter-rouge">bar</code>. We can refer to the name <code class="language-plaintext highlighter-rouge">acab</code> inside the braces, since it has been defined. We can also refer to the name <code class="language-plaintext highlighter-rouge">leet</code>, which came from the ‘world outside’.</p>

<p>However, at the end of the scope, the closing brace <code class="language-plaintext highlighter-rouge">}</code>, everything that was declared inside the scope is destroyed! If we try to refer to <code class="language-plaintext highlighter-rouge">acab</code> again, it fails. Names do not last forever. We are constantly ‘stacking’ scopes on top of each other (e.g. by calling functions, we’ll get to that in a moment). When we leave a layer of the stack, it disappears, and all the names it knew about are forgotten…</p>

<p>It might not be obvious why this is useful yet, besides avoiding accidents when the same names are used in multiple places… but it all relates to some of Rust’s other useful features to do with memory management and lifetimes. We’ll get there.</p>

<p>There is no concept of scope or names on the level of assembly. There are just registers and memory addresses. Scopes are part of the abstract machine, also known as the <dfn>semantics</dfn> of the language.</p>

<h3 id="shadowing">shadowing</h3>

<p>This is honestly a bit niche, but worth mentioning: you can replace a name with another name. This declaration lasts until the end of its scope, after which it falls away and reveals the old name again.</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">foo</span> <span class="o">=</span> <span class="mi">1312</span><span class="p">;</span>
    <span class="p">{</span>
        <span class="c1">//the previous foo becomes 'shadowed'</span>
        <span class="k">let</span> <span class="n">foo</span> <span class="o">=</span> <span class="mi">1337</span><span class="p">;</span>

        <span class="c1">//prints 1337</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"Inner foo: {}"</span><span class="p">,</span> <span class="n">foo</span><span class="p">);</span>
        <span class="c1">//inner foo is dropped</span>
    <span class="p">}</span>
    <span class="c1">//prints 1312</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"Outer foo: {}"</span><span class="p">,</span> <span class="n">foo</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>This is called ‘shadowing’, and many languages do not have it. It is useful to know about, though.</p>

<h3 id="mutable-variables">mutable variables</h3>

<p>So far, we have never <em>changed</em> the value we’ve stored behind a name. This is called ‘mutation’. Traditionally, the things behind names could always be mutated, which is why they tend to be called ‘variables’.</p>

<p>Rust also allows mutation, but we have to explicitly say we want to allow it when we name something. Here’s a simple example:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">tobias_form</span> <span class="o">=</span> <span class="s">"human"</span><span class="p">;</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"tobias is currently a {}"</span><span class="p">,</span> <span class="n">tobias_form</span><span class="p">);</span>
    <span class="n">tobias_form</span> <span class="o">=</span> <span class="s">"hawk"</span><span class="p">;</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"tobias is currently a {}"</span><span class="p">,</span> <span class="n">tobias_form</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>If we hadn’t included the <code class="language-plaintext highlighter-rouge">mut</code> when declaring <code class="language-plaintext highlighter-rouge">tobias_form</code>, we’d get a compilation error when we try to assign a new value to it.</p>

<p>Note that with mutable variables, you can ‘reach outside’ the self-contained world of a scope.</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">tobias_form</span> <span class="o">=</span> <span class="s">"human"</span><span class="p">;</span>
    <span class="k">let</span> <span class="n">cassie_form</span> <span class="o">=</span> <span class="s">"human"</span><span class="p">;</span>
    <span class="nd">print!</span><span class="p">(</span><span class="s">"tobias is currently a {}"</span><span class="p">,</span> <span class="n">tobias_form</span><span class="p">);</span>
    <span class="nd">print!</span><span class="p">(</span><span class="s">"cassie is currently a {}"</span><span class="p">,</span> <span class="n">cassie_form</span><span class="p">);</span>
    <span class="p">{</span>
        <span class="c1">//time to battle some yeerks!</span>
        <span class="n">tobias_form</span> <span class="o">=</span> <span class="s">"hawk"</span><span class="p">;</span>
        <span class="k">let</span> <span class="n">cassie_form</span> <span class="o">=</span> <span class="s">"horse"</span><span class="p">;</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"tobias is currently a {}"</span><span class="p">,</span> <span class="n">tobias_form</span><span class="p">);</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"cassie is currently a {}"</span><span class="p">,</span> <span class="n">cassie_form</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="nd">print!</span><span class="p">(</span><span class="s">"tobias is currently a {}"</span><span class="p">,</span> <span class="n">tobias_form</span><span class="p">);</span>
    <span class="nd">print!</span><span class="p">(</span><span class="s">"cassie is currently a {}"</span><span class="p">,</span> <span class="n">cassie_form</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Oh no! Tobias got stuck as a hawk!</p>

<p>Mutable variables are generally more complicated than immutable ones because they might be mutated in all sorts of different places. They make it easier to create bugs if you assume a name refers to one thing but it’s actually a different thing. So it’s a good idea to only make things mutable when they <em>need</em> to be mutable.</p>

<h2 id="what-is-a-language-for">what is a language for?</h2>

<p>The function of a programming language is to let you express, as clearly and precisely as possible, the intent you wish to perform. In practice, this means describing a number of abstract entities you wish to bestow an ‘as if’ existence. The compiler will then do the hard work of arranging the world in order to fulfil your wish. You need to meet it halfway, though: understand how things work enough to speak a language it understands and follow the rules.</p>

<p>So far we have just given names to some numbers. Soon we’ll be making other things: data structures, functions, types, and all sorts. Then, we can describe how these abstract things should interact with each other.</p>

<p>Could you have a programming language which does not involve bestowing names? Yes, certainly: you could, for example, directly push and pop things onto a stack with suitable commands. It would be a headache and you would not be using <em>your</em> superpower as a language-using creature, which is to invent new concepts and attach them to words.</p>

<p>Ah, but all this adding numbers together is pretty boring, isn’t it. Let’s work through a more complex example: a simple dungeon game to be played in the console.</p>

<h2 id="a-dungeon-game">a dungeon game</h2>

<p>You may have played a game like this before. You have a bunch of ascii characters expressing walls and creatures. Like this…</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>############
#..........#
#..@.......#
#.......g..#
#..........#
############
</code></pre></div></div>
<p>In this world, creatures live on a grid. (Grids are easy to represent.) The position of the player is represented by an <code class="language-plaintext highlighter-rouge">@</code> sign. There is another creature, represented by the letter <code class="language-plaintext highlighter-rouge">g</code>, in the room.</p>

<p>What does our program need to do? On a high level…</p>

<ul>
  <li>it needs to communicate the state of the game to the player.</li>
  <li>it needs to receive input, representing the player’s next action.</li>
  <li>it needs to update the simulation in response to the player’s action.</li>
  <li>it needs to update the displayed game state</li>
</ul>

<p>How can we go about doing this? We need to describe the actions that should be taken with the abstract entities we’re naming. There are multiple ways to do this, but we’re angling towards writing functions.</p>

<h2 id="second-orb-to-ponder">second orb to ponder</h2>

<p>Here’s a slightly annoyingly written Rust program to fuck about with names and scopes:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">spell</span> <span class="o">=</span> <span class="s">"Y"</span><span class="p">;</span>
    <span class="p">{</span>
        <span class="k">let</span> <span class="n">spell</span> <span class="o">=</span> <span class="s">"X"</span><span class="p">;</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">spell</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="p">{</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">spell</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">spell</span> <span class="o">=</span> <span class="s">"Z"</span><span class="p">;</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"{}{}"</span><span class="p">,</span> <span class="n">spell</span><span class="p">,</span> <span class="n">spell</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">spell</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Can you work out what it prints? (<code class="language-plaintext highlighter-rouge">print</code> is the same as <code class="language-plaintext highlighter-rouge">println</code> mostly, it just does not put a newline at the end so you can keep writing on the same line.) Write down a guess, then run it and see if you’re right.</p>

<p>Most of the time you will not be directly putting pointless scopes and constantly shadowing variables in the middle of a function like this! But functions, loops, conditionals and the like all depend on scopes to work.</p>]]></content><author><name></name></author><category term="programming" /><category term="magic" /><category term="programming grimoire" /><summary type="html"><![CDATA[We introduce the most fundamental magical act.]]></summary></entry><entry><title type="html">programming grimoire [3]::creating spells</title><link href="https://canmom.art/programming/magic/3-functions" rel="alternate" type="text/html" title="programming grimoire [3]::creating spells" /><published>2026-06-07T00:00:00+00:00</published><updated>2026-06-07T00:00:00+00:00</updated><id>https://canmom.art/programming/magic/3-functions</id><content type="html" xml:base="https://canmom.art/programming/magic/3-functions"><![CDATA[<p>Last time we saw that programming consists of defining names and putting things behind them. We got a little sense for the ‘geography’ of a program: the names only exist in some places.</p>

<p>This is one big part of the puzzle. The next powerful spell is functions.</p>

<ol id="markdown-toc">
  <li><a href="#functions" id="markdown-toc-functions">functions</a>    <ol>
      <li><a href="#functions-abstracted" id="markdown-toc-functions-abstracted">functions abstracted</a></li>
      <li><a href="#side-effects" id="markdown-toc-side-effects">side effects</a></li>
    </ol>
  </li>
  <li><a href="#types" id="markdown-toc-types">types</a>    <ol>
      <li><a href="#types-are-enforced-at-compile-time" id="markdown-toc-types-are-enforced-at-compile-time">types are enforced at compile time</a></li>
    </ol>
  </li>
  <li><a href="#a-function-to-display-the-dungeon" id="markdown-toc-a-function-to-display-the-dungeon">A function to display the dungeon</a>    <ol>
      <li><a href="#loops" id="markdown-toc-loops">loops</a></li>
    </ol>
  </li>
  <li><a href="#buffering-with-arrays" id="markdown-toc-buffering-with-arrays">buffering with arrays</a></li>
  <li><a href="#a-third-orb-to-ponder" id="markdown-toc-a-third-orb-to-ponder">a third orb to ponder</a></li>
</ol>

<h2 id="functions">functions</h2>

<p>Much like the programs inside the operating system, we can think of the inside of a program as being made of smaller pieces called functions. We’ve already seen a function: <code class="language-plaintext highlighter-rouge">fn main()</code> is Rust’s way of declaring that there is a function called <code class="language-plaintext highlighter-rouge">main</code>. By default, Rust programs always do a little setup stuff and then start in the function called <code class="language-plaintext highlighter-rouge">main</code>.</p>

<p>There are several ways to look at functions. One is that you run the function, it does some calculation, and then it <em>returns</em> a value to the place that called it. In Rust, this is defined like so…</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">give_me_four</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="nb">i32</span> <span class="p">{</span>
    <span class="mi">4</span>
<span class="p">}</span>
</code></pre></div></div>
<p>This is a function which always returns the integer value <code class="language-plaintext highlighter-rouge">4</code>. The beginning part is the most important. It breaks down like this:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">fn</code> says that we are declaring a function</li>
  <li><code class="language-plaintext highlighter-rouge">give_me_four</code> is the name we are assigning to the function</li>
  <li><code class="language-plaintext highlighter-rouge">()</code> is where the function’s arguments would go. this function has no arguments</li>
  <li><code class="language-plaintext highlighter-rouge">-&gt;</code> is used to indicate the <dfn>return type</dfn> of the function, more on that in a sec</li>
  <li><code class="language-plaintext highlighter-rouge">i32</code> is the type of a 32-bit integer, more on that in a sec as well</li>
  <li><code class="language-plaintext highlighter-rouge">{</code> begins a scope, the ‘function body’, which is what the function actually does</li>
  <li><code class="language-plaintext highlighter-rouge">4</code> is an expression (a single calculation), in this case just the value 4. it does not have a semicolon so it gets returned</li>
  <li><code class="language-plaintext highlighter-rouge">}</code> ends the function scope</li>
</ul>

<p>Note that in Rust, unlike a lot of other languages, we don’t usually need to use a keyword such as <code class="language-plaintext highlighter-rouge">return</code> to leave a function. If the last line of the function is an expression without a semicolon, that is what gets returned.</p>

<p>You can <dfn>call</dfn> this function like so, by putting some parentheses right after it:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">hopefully_four</span> <span class="o">=</span> <span class="nf">give_me_four</span><span class="p">();</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"given {}"</span><span class="p">,</span> <span class="n">hopefully_four</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Calling a function means you jump into the function, run its code, and then come back to where you left off. It’s sort of like you dropped the function body right there as a scope, like this:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">hopefully_four</span> <span class="o">=</span> <span class="p">{</span>
        <span class="mi">4</span>
    <span class="p">};</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"given {}"</span><span class="p">,</span> <span class="n">hopefully_four</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>To be useful, functions usually need to have <dfn>arguments</dfn> which are filled in when the function is run. Here’s a really boring example:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">add_four</span><span class="p">(</span><span class="n">num</span><span class="p">:</span> <span class="nb">i32</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">i32</span> <span class="p">{</span>
    <span class="n">num</span> <span class="o">+</span> <span class="mi">4</span>
<span class="p">}</span>
</code></pre></div></div>
<p>This function takes a 32-bit integer, adds 4 to it, and then returns the result of this calculation. We can <dfn>call</dfn> it by putting a value into the parentheses after the name of the function.</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="c1">//we can put a number in</span>
    <span class="k">let</span> <span class="n">four_more_than_twelve</span> <span class="o">=</span> <span class="nf">add_four</span><span class="p">(</span><span class="mi">12</span><span class="p">);</span> <span class="c1">//16</span>

    <span class="c1">//we can put a named identifier in</span>
    <span class="k">let</span> <span class="n">leet</span> <span class="o">=</span> <span class="mi">1337</span><span class="p">;</span>
    <span class="k">let</span> <span class="n">four_more_than_leet</span> <span class="o">=</span> <span class="nf">add_four</span><span class="p">(</span><span class="n">leet</span><span class="p">);</span> <span class="c1">//1341</span>

    <span class="c1">//we can put an expression in.</span>
    <span class="c1">//this means we'll evaluate the expression and then put the result into the function.</span>
    <span class="k">let</span> <span class="n">four_more_than_an_expression</span> <span class="o">=</span> <span class="nf">add_four</span><span class="p">(</span><span class="n">leet</span> <span class="o">+</span> <span class="mi">12</span><span class="p">);</span> <span class="c1">//1353</span>

    <span class="c1">//rust won't let us call the function with the wrong number of arguments</span>
    <span class="k">let</span> <span class="n">error_too_few</span> <span class="o">=</span> <span class="nf">add_four</span><span class="p">();</span> <span class="c1">//error: no argument</span>
    <span class="k">let</span> <span class="n">error_too_many</span> <span class="o">=</span> <span class="nf">add_four</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">)</span> <span class="c1">//error: too many arguments</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Just like before, it’s as if the function was inserted where we called it, but assigning names to hold each input.</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="c1">//this...</span>
    <span class="k">let</span> <span class="n">four_more_than_twelve</span> <span class="o">=</span> <span class="nf">add_four</span><span class="p">(</span><span class="mi">12</span><span class="p">);</span>

    <span class="c1">//is essentially the same as...</span>
    <span class="k">let</span> <span class="n">four_more_than_twelve</span> <span class="o">=</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">num</span> <span class="p">:</span> <span class="nb">i32</span> <span class="o">=</span> <span class="mi">12</span><span class="p">;</span>
        <span class="n">num</span> <span class="o">+</span> <span class="mi">4</span>
    <span class="p">};</span>
<span class="p">}</span>
</code></pre></div></div>
<p>The compiler might do exactly that, instead of jumping. This is called ‘inlining’.</p>

<h3 id="functions-abstracted">functions abstracted</h3>

<p>Although I’ve described a function as a series of instructions to perform, this is not how a mathematician views a function. A mathematician thinks of a function as a ‘mapping between sets’, like a bunch of tiny little arrows from each input to each output. For our <code class="language-plaintext highlighter-rouge">add_four</code> function, 0 is mapped to 4, 1 is mapped to 5, 2 is mapped to 6, and so on.</p>

<p>The actual instructions used to perform this mapping do not matter so much. Many different sets of instructions can be used to represent the same function, as long as they give the same output for every possible input. The compiler can take advantage of this, by finding a faster set of instructions to ‘do the same thing’.</p>

<p>Thinking about functions as just a mapping only really works if we have what are known as ‘pure functions’: functions which don’t touch anything ‘outside’ the function, just quietly do their calculation and pass back the result. But there are other types of function…</p>

<h3 id="side-effects">side effects</h3>

<p><code class="language-plaintext highlighter-rouge">println!</code> is also a function. (Technically, a macro that generates a function call. Don’t worry about that for now.) However, this type of function doesn’t simply make a calculation and then politely return it: it goes away and <em>does something</em>, in this case, tell the operating system that we would like to print out some text please.</p>

<p>This is known as a ‘side effect’. In Rust, functions can have side effects. In order to do so, they need to ‘know about’ something outside their own scope. This is called ‘capturing’.</p>

<p>For now, the only side effect we will concern ourselves with is printing things to the console. Pure functions are easier to reason about and usually allow the compiler to make things a lot faster to boot.</p>

<h2 id="types">types</h2>

<p>Let’s talk about data types! What’s all this <code class="language-plaintext highlighter-rouge">i32</code> stuff? What’s a ‘32 bit integer` when it’s at home?</p>

<p>Well, an <em>integer</em> is a whole number. 32 bits means that it uses 32 <dfn>bits</dfn> (binary values, that can be 0 or 1) to store the number. This is the same as four <dfn>bytes</dfn>, since a byte is 8 bits. <code class="language-plaintext highlighter-rouge">i32</code> is a signed integer data type which can store about four billion different whole numbers between \(-2^{31}=-2\,147\,483\,648\) and \(2^{31}-1=2\,147\,483\,647\). (You can get these numbers easily with <code class="language-plaintext highlighter-rouge">i32::MIN</code> and <code class="language-plaintext highlighter-rouge">i32::MAX</code>).</p>

<p>Once again, this is an ‘as if’ rule that belongs to the abstract machine. As far as the hardware is concerned, bytes are just bytes. Let’s say you have a register containing the 32-bit binary value <code class="language-plaintext highlighter-rouge">0000 0000 0000 0000 0000 0101 0011 1001</code>. What is that? Maybe it’s an integer with the value 1337 arranged in big-endian order. Maybe it’s a string of Unicode characters. Maybe it’s part of an image. The computer does not give a shit: it will do whatever its next instruction says. If the next instruction is 32-bit integer addition then it will treat those bits as a 32-bit integer.</p>

<p>The <em>compiler</em> cares a lot, though. Rust is a strongly typed language, which means that as far as the language semantics are concerned, every name you assign also has a <em>data type</em> which defines what you’re able to do with it.</p>

<p>We’ve not been explicitly assigning types so far, because the compiler is pretty clever: it can assume that if you are putting an integer in something, it’s intended to have integer type. And by default, numbers without a decimal point have the type <code class="language-plaintext highlighter-rouge">i32</code>, so we can skip writing that.</p>

<p>We can be explicit if we want to, though. Let’s check out a few animals in the type zoo…</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">//this line introduces some names from elsewhere</span>
<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">sync</span><span class="p">::{</span><span class="nb">Arc</span><span class="p">,</span> <span class="n">Mutex</span><span class="p">};</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
   <span class="k">let</span> <span class="n">unsigned_acab</span> <span class="p">:</span> <span class="nb">u32</span> <span class="o">=</span> <span class="mi">1312</span><span class="p">;</span>
   <span class="k">let</span> <span class="n">bigger_acab</span> <span class="p">:</span> <span class="nb">i64</span> <span class="o">=</span> <span class="mi">1312</span><span class="p">;</span>
   <span class="k">let</span> <span class="n">float_acab</span> <span class="p">:</span> <span class="nb">f32</span> <span class="o">=</span> <span class="mf">1312.0</span><span class="p">;</span>
   
   <span class="k">let</span> <span class="n">acab_array</span> <span class="p">:</span> <span class="p">[</span><span class="nb">i32</span><span class="p">;</span> <span class="mi">5</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1312</span><span class="p">,</span> <span class="mi">1312</span><span class="p">,</span> <span class="mi">1312</span><span class="p">,</span> <span class="mi">1312</span><span class="p">,</span> <span class="mi">1312</span><span class="p">];</span>
   <span class="k">let</span> <span class="n">acab_str_slice</span> <span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="s">"1312"</span><span class="p">;</span>
   <span class="k">let</span> <span class="n">silly_nonsense</span> <span class="p">:</span> <span class="nb">Arc</span><span class="o">&lt;</span><span class="n">Mutex</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;&gt;</span> <span class="o">=</span> <span class="nn">Arc</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span><span class="nn">Mutex</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span><span class="mi">1312</span><span class="p">));</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Here we have declared an unsigned 32-bit integer, a signed 64-bit integer, a 32-bit float, an array of integers, a string slice, and a slightly more complicated thing that I’m mostly including as foreshadowing ;p</p>

<p>The <code class="language-plaintext highlighter-rouge">u32</code> uses the same space as an <code class="language-plaintext highlighter-rouge">i32</code>, but it only allows positive numbers. So it can store numbers from 0 up to 4294967295.</p>

<p>The <code class="language-plaintext highlighter-rouge">i64</code> type uses twice as much space as an <code class="language-plaintext highlighter-rouge">i32</code>, allowing it to store numbers from \(-9\,223\,372\,036\,854\,775\,808\) to \(9\,223\,372\,036\,854\,775\,807\).</p>

<p>The <code class="language-plaintext highlighter-rouge">f32</code> type is a floating point type. Floating point types are a special representation of numbers which allows fractions and large numbers to be stored in the same 32 bits. Just like <code class="language-plaintext highlighter-rouge">i32</code> and <code class="language-plaintext highlighter-rouge">u32</code>, you have about four billion possible floats, but they are not spaced evenly on the number line: increasingly, more and more numbers are ‘missing’ the further away you get from zero. You <em>also</em> have special values like ‘infinity’ and ‘not a number’. Floats are quite weird and there are a lot of nuances to them; they are a leaky abstraction designed to approximately represent our intuitive idea of how real numbers work.</p>

<p>The last three are some examples of slightly more complex types that you will one day be able to express in Rust. They are respectively an array, a string slice, and an “automatically reference counted smart pointer containing a mutex containing a 32 bit integer”, which is the sort of thing you might sometimes need if you’re writing multithreaded programs.</p>

<p>But what’s the point of all this? Types exist so the compiler can help us. They let us express what something is supposed to be, and make sure, before our program even runs, that we don’t try to do something that doesn’t make sense. If a function is written on the assumption that its input is one thing, the types express that to the compiler so we don’t try to run it in a way that wouldn’t work.</p>

<h3 id="types-are-enforced-at-compile-time">types are enforced at compile time</h3>

<p>Let’s add another line to this:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
   <span class="k">let</span> <span class="n">unsigned_acab</span> <span class="p">:</span> <span class="nb">u32</span> <span class="o">=</span> <span class="mi">1312</span><span class="p">;</span>
   <span class="k">let</span> <span class="n">bigger_acab</span> <span class="p">:</span> <span class="nb">i64</span> <span class="o">=</span> <span class="mi">1312</span><span class="p">;</span>

   <span class="k">let</span> <span class="n">causes_error</span> <span class="o">=</span> <span class="n">unsigned_acab</span> <span class="o">+</span> <span class="n">bigger_acab</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>This last line will cause an error.</p>

<p>We’re trying to add a 32-bit unsigned integer to a 64-bit signed integer. Although that seems like it probably would make sense, Rust doesn’t know what sort of value you would want the result to be, so it hasn’t defined what addition does for these two types. Before you add the numbers together, you need to <em>convert</em>, or <em>cast</em>, the numbers into a compatible pair of types which can be added.</p>

<p>For simple types like this, it can be done with the <code class="language-plaintext highlighter-rouge">as</code> keyword to convert one type into the other:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
   <span class="k">let</span> <span class="n">unsigned_acab</span> <span class="p">:</span> <span class="nb">u32</span> <span class="o">=</span> <span class="mi">1312</span><span class="p">;</span>
   <span class="k">let</span> <span class="n">bigger_acab</span> <span class="p">:</span> <span class="nb">i64</span> <span class="o">=</span> <span class="mi">1312</span><span class="p">;</span>

   <span class="k">let</span> <span class="n">no_error</span> <span class="o">=</span> <span class="n">unsigned_acab</span> <span class="k">as</span> <span class="nb">i64</span> <span class="o">+</span> <span class="n">bigger_acab</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>It’s always safe (in the sense that no information will be lost) to turn a <code class="language-plaintext highlighter-rouge">u32</code> into an <code class="language-plaintext highlighter-rouge">i64</code>, but not the other way round. If the <code class="language-plaintext highlighter-rouge">i64</code> is negative, or larger than the maximum <code class="language-plaintext highlighter-rouge">u32</code>, there is no mathematically correct answer for this operation. However, Rust has <a href="https://doc.rust-lang.org/reference/expressions/operator-expr.html#semantics">rules</a> about what to do here. Essentially, casting down to a smaller type ‘truncates’ the integer, keeping only the last 32 bits. Negative values get a little bit complicated, we’ll brush over it for now. (Though feel free to try casting some negative integers to unsigned integers and see what comes out!)</p>

<p>Does this mean that we should always use the biggest available number type, such as <code class="language-plaintext highlighter-rouge">i128</code>? This is where the abstraction starts to get leaky again! Most modern processors work with 64-bit values. To handle a 128-bit number, the compiler is forced to generate multiple instructions, and the program will be slower. It will still follow the stipulations of the abstract machine… but the abstract machine is different from the real machine in an important way, and so the real machine has to do more work to satisfy the abstract machine’s demands.</p>

<p>There are other good reasons to want to use smaller types. For example, if you are crunching lots of repetitive data, like pixels, you want to pack the data into arrays, and it matters a lot how much space an array takes up, how quickly it can be loaded in and out of memory, and so on. In this case, there are good reasons to try to use the smallest type you can get away with.</p>

<p>Unsigned types are also useful because the compiler will make sure you don’t create negative numbers by accident. Indeed, one of the most powerful things we can do in programming is to create our own types to express the needs of our program to let the compiler help us out. We’ll do that soon, but let’s get back to the dungeon game.</p>

<h2 id="a-function-to-display-the-dungeon">A function to display the dungeon</h2>

<p>Let’s imagine one way of displaying an empty room in the dungeon. We could print it out, line by line, like this:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"#############"</span><span class="p">);</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"#...........#"</span><span class="p">);</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"#...........#"</span><span class="p">);</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"#...........#"</span><span class="p">);</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"#############"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>However, we probably want to print out rooms of different sizes, and in different positions, and so on. And in general, if you find yourself repeating yourself, it’s probably a good idea to make a function to express your intent more clearly.</p>

<p>Let’s start by creating loops.</p>

<h3 id="loops">loops</h3>

<p>One thing that computers are <em>really</em> good at is doing the same thing over and over again. This is such a common construct that nearly every programming language has some way to represent it. It’s called a ‘loop’.</p>

<p>Although so far the story has concerned Rust, I need to briefly talk about some history here. C, C++, and similar languages write loops like this:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
    <span class="c1">//do some shit</span>
<span class="p">}</span>
</code></pre></div></div>
<p>In C, this says: assign a variable of integer type called <code class="language-plaintext highlighter-rouge">i</code>; at the beginning of each loop, check if <code class="language-plaintext highlighter-rouge">i</code> is less than 10; at the end of each loop, add 1 to i.</p>

<p>In other words, it says ‘for each number from 0 up to 9 inclusive, do some shit’.</p>

<p>In Rust, this way of writing a loop can be done:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="k">mut</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">10</span> <span class="p">{</span>
    <span class="c1">//do some shit</span>
    <span class="n">i</span> <span class="o">=</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>However, this is not how Rust <em>likes</em> to do things. Rust would generally prefer that you ‘iterate over’ something. It looks like this…</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="mi">10</span> <span class="p">{</span>
    <span class="c1">//do some shit</span>
<span class="p">}</span>
</code></pre></div></div>
<p>In a Rust for loop, we are saying something slightly different: we have a thing we’re walking along, and we say, for each time round the loop, take the ‘next thing’ until we run out of things. This is more similar to how Python does it than how C does it. (Note that this time, the variable <code class="language-plaintext highlighter-rouge">i</code> only lives in each iteration of the loop, and doesn’t ‘leak out’ into the outer scope.)</p>

<p>The thing we’ve written here, <code class="language-plaintext highlighter-rouge">0..10</code>, is called a ‘range’. It’s Rust’s way of representing ‘the numbers from 0 to one-less-than 10’. If you want to include 10, you can put <code class="language-plaintext highlighter-rouge">1..=10</code>. You are more explicitly describing your <em>intent</em> (do something with every number from 0 up to 9) rather than <em>how you go about achieving that intent</em>; the compiler takes care of the fiddly details.</p>

<p>Ranges are not the only thing we can iterate over, but they’re the only thing we need to iterate over for now.</p>

<p>Let’s try putting a loop in our room drawing program…</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">room_height</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"#############"</span><span class="p">);</span>
    <span class="k">for</span> <span class="n">row</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">room_height</span> <span class="p">{</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"#...........#"</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"#############"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>We could also have another loop to represent the width of the room…</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">room_height</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
    <span class="k">let</span> <span class="n">room_width</span> <span class="o">=</span> <span class="mi">9</span><span class="p">;</span>
    <span class="k">for</span> <span class="n">column</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">room_width</span><span class="o">+</span><span class="mi">2</span> <span class="p">{</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"#"</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="c1">//print a newline to end the row</span>
    <span class="nd">println!</span><span class="p">();</span>
    
    <span class="k">for</span> <span class="n">row</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">room_height</span> <span class="p">{</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"#"</span><span class="p">);</span>
        <span class="k">for</span> <span class="n">column</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">room_width</span> <span class="p">{</span>
            <span class="nd">print!</span><span class="p">(</span><span class="s">"."</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"#"</span><span class="p">);</span>
    <span class="p">}</span>
    
    <span class="k">for</span> <span class="n">column</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">room_width</span><span class="o">+</span><span class="mi">2</span> <span class="p">{</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"#"</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="nd">println!</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>
<p>We can factor this out into a function, and pass the width and height in as arguments.</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="nf">print_room</span><span class="p">(</span><span class="mi">11</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">print_room</span><span class="p">(</span><span class="n">width</span><span class="p">:</span> <span class="nb">u32</span><span class="p">,</span> <span class="n">height</span><span class="p">:</span> <span class="nb">u32</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">for</span> <span class="n">column</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">width</span> <span class="p">{</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"#"</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="c1">//print a newline to end the row</span>
    <span class="nd">println!</span><span class="p">();</span>
    
    <span class="k">for</span> <span class="n">row</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">height</span> <span class="p">{</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"#"</span><span class="p">);</span>
        <span class="k">for</span> <span class="n">column</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">width</span> <span class="p">{</span>
            <span class="nd">print!</span><span class="p">(</span><span class="s">"."</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"#"</span><span class="p">);</span>
    <span class="p">}</span>
    
    <span class="k">for</span> <span class="n">column</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">width</span> <span class="p">{</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"#"</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="nd">println!</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Hang on, how are we using <code class="language-plaintext highlighter-rouge">print_room</code> before it’s defined? That stuff I said about how names only exist at certain points in time doesn’t apply for functions, just <code class="language-plaintext highlighter-rouge">let</code> bindings. Functions can be declared in any order, and they exist for the entire duration of the scope, which is in this case the entire program.</p>

<p>That’s a little repetitive. We have the row-drawing code twice. Let’s make that a function too…</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="nf">print_room</span><span class="p">(</span><span class="mi">11</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">print_room</span><span class="p">(</span><span class="n">width</span><span class="p">:</span> <span class="nb">u32</span><span class="p">,</span> <span class="n">height</span><span class="p">:</span> <span class="nb">u32</span><span class="p">)</span> <span class="p">{</span>
    <span class="nf">print_horizontal_wall</span><span class="p">(</span><span class="n">width</span><span class="p">);</span>
    
    <span class="k">for</span> <span class="n">row</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">height</span> <span class="p">{</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"#"</span><span class="p">);</span>
        <span class="k">for</span> <span class="n">column</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">width</span> <span class="p">{</span>
            <span class="nd">print!</span><span class="p">(</span><span class="s">"."</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"#"</span><span class="p">);</span>
    <span class="p">}</span>
    
    <span class="nf">print_horizontal_wall</span><span class="p">(</span><span class="n">width</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">print_horizontal_wall</span><span class="p">(</span><span class="n">width</span><span class="p">:</span> <span class="nb">u32</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">for</span> <span class="n">column</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">width</span><span class="o">+</span><span class="mi">2</span> <span class="p">{</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"#"</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="c1">//print a newline to end the row</span>
    <span class="nd">println!</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>
<p>By giving these individual bits of logic names, it is much easier to understand what the program is doing.</p>

<h2 id="buffering-with-arrays">buffering with arrays</h2>

<p>This code will work, and it helpfully separates concerns like ‘how big is our room’ from ‘what characters do you use to draw a room’. However, it’s not going to be a good basis for making a game on, because we can’t easily put anything in this room, we can’t easily draw more than one room, and it also may be inefficient to make so many calls to <code class="language-plaintext highlighter-rouge">print!</code>, each of which potentially has to bring in a lot of extra machinery. We could theoretically add checks like ‘is there a character in this square’, but that’s going to make our code quite convoluted.</p>

<p>It would be much better if we could have a kind of ‘working area’ where we draw the rooms and characters as separate operations, and then print the whole thing out at once.</p>

<p>Which is a wonderful excuse to introduce array types!</p>

<h2 id="a-third-orb-to-ponder">a third orb to ponder</h2>

<p>You can clear the console by running</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">print!</span><span class="p">(</span><span class="s">"{esc}c"</span><span class="p">,</span> <span class="n">esc</span> <span class="o">=</span> <span class="mi">27</span> <span class="k">as</span> <span class="nb">char</span><span class="p">);</span>
</code></pre></div></div>
<p>which sends a special ‘control character’ signal which instructs the console to clear itself. (How do I know that? I googled ‘rust clear console’ and found a Stack Overflow thread which provided various answers; this one worked.)</p>

<p>You can also run this code to make the program wait:</p>
<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">std</span><span class="p">::</span><span class="nn">thread</span><span class="p">::</span><span class="nf">sleep</span><span class="p">(</span><span class="nn">std</span><span class="p">::</span><span class="nn">time</span><span class="p">::</span><span class="nn">Duration</span><span class="p">::</span><span class="nf">from_millis</span><span class="p">(</span><span class="mi">1000</span><span class="o">/</span><span class="mi">60</span><span class="p">));</span>
</code></pre></div></div>
<p>which will make the program stop doing anything for 1/60 seconds. (Don’t worry for now about all this <code class="language-plaintext highlighter-rouge">::</code> stuff: that’s just a way of looking up names. We’ll cover it more later.)</p>

<p>Using these two commands, and an extra loop, can you make an animation which causes the room to expand?</p>]]></content><author><name></name></author><category term="programming" /><category term="magic" /><category term="programming grimoire" /><summary type="html"><![CDATA[We learn how to name and give form to our wishes.]]></summary></entry><entry><title type="html">Let’s read Umineko! - episode 5 - chapter 14</title><link href="https://canmom.art/livereads/umineko/ep5/chapter-14" rel="alternate" type="text/html" title="Let’s read Umineko! - episode 5 - chapter 14" /><published>2026-06-05T00:00:00+00:00</published><updated>2026-06-05T00:00:00+00:00</updated><id>https://canmom.art/livereads/umineko/ep5/chapter-14</id><content type="html" xml:base="https://canmom.art/livereads/umineko/ep5/chapter-14"><![CDATA[<p>Hello everyone! I really appreciate the warm welcome back for this liveblog. You are all very, very sweet and all currently active flavours of Bryn appreciate it.</p>

<ol id="markdown-toc">
  <li><a href="#chapter-14-the-great-court-of-illusions" id="markdown-toc-chapter-14-the-great-court-of-illusions">Chapter 14: <cite>The Great Court of Illusions</cite></a>    <ol>
      <li><a href="#the-murder-of-hideyoshi" id="markdown-toc-the-murder-of-hideyoshi">the murder of Hideyoshi</a></li>
      <li><a href="#the-murder-of-the-four-in-the-guest-house" id="markdown-toc-the-murder-of-the-four-in-the-guest-house">the murder of the four in the guest house</a></li>
      <li><a href="#the-murder-of-genji" id="markdown-toc-the-murder-of-genji">the murder of Genji</a></li>
      <li><a href="#did-krauss-do-it" id="markdown-toc-did-krauss-do-it">did Krauss do it?</a></li>
      <li><a href="#a-verdict" id="markdown-toc-a-verdict">a verdict?</a></li>
      <li><a href="#battlers-turn" id="markdown-toc-battlers-turn">Battler’s turn</a></li>
      <li><a href="#knox-speedrun" id="markdown-toc-knox-speedrun">Knox% speedrun</a></li>
      <li><a href="#can-we-solve-it-for-real" id="markdown-toc-can-we-solve-it-for-real">can we solve it for real?</a></li>
      <li><a href="#battlers-last-gasp" id="markdown-toc-battlers-last-gasp">battler’s last gasp</a></li>
    </ol>
  </li>
</ol>

<p>Branwen wrote another wonderfully big comment, this time with some excellent analysis of Natsuhi:</p>

<details>
  <summary>Branwen</summary>

  <blockquote>
    <p>Welcome back!!! I’m really happy that the comments are appreciated, Umineko is really special and dear to me and honestly this is one of my favorite live-reads, its been a joy to read through to the point that I absolutely did post that comment while rereading it hehe :)</p>

    <p>Actually, I appreciate the whole canmom blog in general, its lovely (and even a little nostalgic?) to just see someone posting thoughts and essays with that more… I’m not totally sure how to describe it, personal feel I guess? Like it feels like a lot of what people put on the internet these days has an implicit audience and exists in the shadow of algorithmic ranking systems and metrics, where being more popular is “better” in some way?</p>

    <p>So I very much treasure finding and reading stuff that feels like it was written just for the sake of writing, for the joy or catharsis of it; or just that feeling of “I NEED to talk about this or I will lose it.” Even when I know very little about some of the other topics written about here, the sincerity and passion for the subjects is more than enough to make it a meaningful read… Makes me want to host my own blog too honestly?</p>

    <p>Anyway, yeah, to get back on topic, Natsuhi really DOES need to get out of that closet ASAP, the comphet on that poor woman is craazy. I’m not saying she’s straight-up a lesbian, but there’s no way she wouldn’t date a girl or two while keeping Krauss as her findom side boy if she knew it was an option. Like, all the women in Umineko are really interesting (to my mind at least!) and unique explorations of the ways patriarchy affects us all and the different ways women can struggle and try to adapt to living under it, but I honestly think she’s one of the most tragic?</p>

    <p>She’s married into the family with little or no say in the matter, and once there her status is essentially “the most important one of the servants, but we frankly trust some of them more (coughgenjicough)”. She works miserably hard to the point of constant stress headaches, managing the entire rather extensive household, on the job training for the orphans that Kinzo seemingly randomly decided should work there as a charity case, raising and educating Jessica to step into her role someday, presumably a great deal of work hosting business guests and the like, and, oh yeah, seemingly doing Krauss’ entire job for him on top of that??? She has no friends or peers that we can see, the only person approaching a peer she can honestly confide is her useless, unsympathetic husband, and half her in-laws actively hate her on top of that.</p>

    <p>And despite all that she seems to honestly believe that the work she’s doing is meaningful and valuable, that the Ushiromiya family name is worthy of all of her suffering, that the role she’s been told her entire life is hers is important and meaningful despite the complete lack of respect she gets for performing it. And I can’t help but think that yeah, there’s no wonder she believes that, for its literally all she has. What choice does she have but to believe in it? How cruel it would be, to go up to this woman and tell her that she wasted her life for nothing, that she should have been more feminist and refused to marry Krauss and run away or something. Is it any wonder that despite the narrative being decidedly sympathetic to the younger servants, the people who suffer the most for Natsuhi’s failings and shortcomings, its still sympathetic to her as well?</p>

    <p>Excited as always for you(y’all?) to read further, im glad if my comments could provide some motivation, and please don’t worry about taking time whenever y’all need :) I’m personally just happy to see other people enjoying such an important piece of literature to me u know?</p>
  </blockquote>

  <p>Once again nailing it. Not a lot to add on this analysis of Natsuhi: it’s a whole horrible complex where everyone gets hurt. Whether or not she turns out to be the murderer in this episode, she really seems to draw the short straw among the non-servant characters. (And, judging by the betel nut flashback scene, Krauss might not have always been so obviously pathetic as he seems to us now. We can easily imagine Natsuhi getting slowly frogboiled into this situation.)</p>

  <p>Thanks for all the kind words as well &lt;3 I would heartily encourage you to run a blog if you want, I would love to read more of your writings! I wouldn’t <em>necessarily</em> recommend doing it the way I do—was recently helping my partner set up a blog with a static site generator hosted on here, and for something that is fundamentally very simple (write files on computer, push, website is built) there are a surprising number of weird technical gotchas due to the clunky legacy elements of Github Pages. Jekyll is… OK, but I want to get off it. Currently eyeing up Zola.</p>

</details>

<p>On Tumblr, starry-carousel <a href="https://canmom.tumblr.com/post/817955733957132288/hello-ive-been-reading-your-umineko-blog-and">wrote</a>:</p>

<blockquote>
  <p>Hello! I‘ve been reading your Umineko blog and since the solvability of the epitaph has come up a few times, I thought I‘d tell you that I think you can solve it! It‘s really really hard without hints, I think there‘s at least one piece of information you need to have in order for it to be solvable, and I‘d suggest trying to solve it with that in mind, trying it without that is basically moot. (There‘s something I‘d like to say here that‘s mostly based on stuff you already know, but I‘ll hold back just in case.) I have mostly solved it in the Flower discord and while it took me a really long time to get there, it was also very very fun and I really suggest trying to solve it with people who know the solution and can give you tips when you‘re stuck and point you in the right direction, I think you could enjoy it and I‘d also love to hear your theories.</p>
</blockquote>

<p>I said I wanted to keep trying without handholding for now (although that does sound like a fun game), but I would definitely be amenable to being told when I have all the hints I’m going to get, and when the solution reveal is imminent.</p>

<hr />

<p>Last time, Natsuhi was stuck in the closet while Hideyoshi got murdered. She narrowly avoided getting found in there, but she was caught in the corridor by Erika, who is about to make the case that she dunnit all.</p>

<p>There are a couple of outstanding mysteries—besides the epitaph, the significance of ‘who am I’ in the last episode could apparently do with a revisit, and it may be worth collating some thoughts about what Lambda’s game expresses about the ultimate Beatrice question as well—but for now I am feeling it would be best to press on into the episode. Without further ado, then…</p>

<h2 id="chapter-14-the-great-court-of-illusions">Chapter 14: <cite>The Great Court of Illusions</cite></h2>

<p>We appear in a big marble room—the same marble room, perhaps, where <span class="smallcaps">Eva Beatrice</span> was bestowed her title of <span class="smallcaps">Beatrice</span> in episode 3. A sculpture of a plant with a glowing white orb at the centre stands at the centre of the room. Everyone, even the ‘witches on an even higher level’, is apparently here, and they are not allowed to think this is at all strange. The background is actually quite tall, scrolling up for a couple of screens.</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/86-columns.webp" alt="A background from the game showing a large brightly lit space surrounded by marble arches with Corinthian columns above them. There is a bright lens flare at the top." loading="lazy" />
    
	<figcaption>
		<p>I’m by no means an architecture expert but a quick check of Wikipedia suggests these are Corinthian capitals at the top of those columns.</p>

		
	</figcaption>
    
</figure>

<p>It’s kind of gaudy—reminds me of Napoleon’s tomb in Paris, which is truly ridiculous if you’ve never seen it. Someone is going absolutely wild on an organ and choir synth on the background.</p>

<p>Well, she might stand to lose, but Lambda evidently won’t miss the opportunity to put on a big show.</p>

<p><span class="smallcaps">Bernkastel</span> remarks that outside of ‘the 18’, everyone must be illusions. <span class="smallcaps">Beatrice</span>—this must be piece!Beatrice—retorts…</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/87-acknowledge.webp" alt="Beatrice: Making you acknowledge them is what my game's all about." loading="lazy" />
    
</figure>

<p>In Japanese, <span lang="ja">「それを認めさせるのが妾のゲームでな。」</span> the verb used is <ruby lang="ja">認める<rp> (</rp><rt>mitomeru</rt><rp>)</rp></ruby> which also <a href="https://jisho.org/word/%E8%AA%8D%E3%82%81%E3%82%8B-1">has senses</a> of recognising, noticing, allowing, observing and carefully observing. A versatile word!</p>

<p>For various personal reasons I (we) have been thinking a lot lately about the ‘reality’ of things that exist inside someone’s head: from the widely recognised ones like ‘thoughts’, ‘beliefs’ and ‘memories’, through abstract objects such as ‘sets’, ‘numbers’ and ‘computer programs’, and all the up to more elaborate and nebulous constructs such as ‘countries’, ‘the law’, and of course ‘plural systems’, ‘headmates’ and the related jargon.</p>

<p>Since you can’t directly physically interact with these things the way you might a physical object such as a ‘chair’, their ‘reality’ is somewhat more open to interpretation—but it seems that you would have a hard time understanding the world and the behaviour of the creatures that inhabit it without modelling their ‘existence’ somehow. ‘Acknowledging’ them, in other words. So seeing this presented in this light is quite interesting.</p>

<p>In any case, this is a ‘witches’ coven’, called in response to Erika requesting one: the Great Court of Illusions mentioned in the chapter title. Which is interesting, because I had sorta wondered if it was going to be run by Dlanor’s inquisitor court.</p>

<p>Lambda declares that the ‘lives and roles within this game’ of the pieces are officially over and this is the 24:00 showdown already. She gets everyone to introduce themselves. Notably <span class="smallcaps">Beatrice</span> asserts her goal as:</p>

<blockquote>
  <p><b class="name smallcaps">Beatrice:</b> I am the Endless Witch, <span class="smallcaps">Beatrice</span>. My goals are to assert my own existence and to protect Natsuhi and Kinzo.</p>
</blockquote>

<p>Battler—who apparently ranks just under witches in whatever hierarchy is operating here—simply says he’s here to fight ‘Beato… no, the witches’. Chiester00 informs him that he can’t initially speak, since he joined the game later than this point. Does his piece also get to participate? Erika is next, as the detective.</p>

<p>Next, the rest of the Ushiromiyas rapidly introduce themselves starting with Kinzo. Starting to hit ‘pronoun circle’ kind of vibes. ‘My name is Ushiromiya Kinzo, my pronouns are he/him’. Who’s gonna do it/its, come on. Anyway, each relative says where they are claiming to be in the narrative…</p>

<ul>
  <li>Kinzo says he’s alive and is in hiding after escaping the window</li>
  <li>Krauss says he’s been kidnapped</li>
  <li>Eva, Rudolf, Natsuhi, Kyrie, Nanjo, Sayo, and Kanon say they’re alive</li>
  <li>Rosa, Jessica, George, Maria and Genji report that they died on the first twilight. Maria cracks a joke about it</li>
  <li>Hideyoshi says he was killed ‘a short while ago’</li>
  <li>Gohda and Kumasawa say よろしくお願いします (pleased to meet you)</li>
</ul>

<p>The witch pieces <span class="smallcaps">Virgilia</span>, Gaap and Ronove report in from a separate, equally ostentatious section of the room.</p>

<p>Remarkably my PS4 controller vibrated when Gaap appeared. I’ve not seem the game activate rumble before (though it may be that it wasn’t able to on Windows). Spooky!</p>

<p>Lucifer reports that she ‘served in the murder of Hideyoshi on the second twilight’, and the Seven Sisters report in.</p>

<p>The Inquisitor group report in, with Dlanor identifying herself as Erika’s assistant. So there’s a few layers to this hierarchy! Erika says that Dlanor’s main responsibility is ‘tricky word games’, like the ‘miracle’ in the study.</p>

<p>Finally, Chiester00 says that the Chiester Sisters Imperial Guard have been tasked with ‘management of proceedings’, and helpfully offers the sum as 38 ‘people’. (I guess the goats aren’t along for this one.) Breaking that down:</p>

<ul>
  <li>2 ‘player’ witches</li>
  <li>1 ‘piece’ witch (<span class="name">Beatrice</span>)</li>
  <li>2 special human pieces (Battler, Erika)</li>
  <li>11 humans who claim to be alive, of whom one is in hiding, and one is allegedly kidnapped</li>
  <li>6 humans who claim to be dead</li>
  <li>10 magic pieces backing up Beatrice</li>
  <li>3 magic pieces backing up Erika</li>
  <li>3 Chiesters overseeing</li>
</ul>

<p>The goats seem to be along after all, since the witches immediately call for drinks and popcorn from them. But they evidently aren’t ‘people’ as far as Chiester00 is concerned. (I guess they’re the ones with the #notaperson it/its in the pronoun circle lmao)</p>

<p>Erika is also plenty happy to showboat, calling silence very dramatically (and apparently suspending everyone’s consciousness) to declare…</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/88-anticipation.webp" alt="Erika: I, Furudo Erika, will make an accusation. The murderer of the fifth game is—" loading="lazy" />
    
	<figcaption>
		<p>With all this buildup, I briefly wondered if it might not be Natsuhi as a twist.</p>

		
	</figcaption>
    
</figure>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/89-release.webp" alt="Erika: Ushiromiya Natsuhi-san. You are the culprit." loading="lazy" />
    
	<figcaption>
		<p>If you’re wondering, <cite>Phoenix Wright: Ace Attorney</cite> was released in 2001.</p>

		
	</figcaption>
    
</figure>

<p>Notably the earlier scene simply took place in the parlour, without all the ceremony—even if the <em>events</em> of the game are the same, it seems like the <em>presentation</em> can be different with Battler here?</p>

<p>In this context, <span class="smallcaps">Beatrice</span> is able to step up and act as Natsuhi’s defense. Although this is a rather unusual court, because the defense is trying to prove that they did the crime, against <span class="smallcaps">Bernkastel</span>’s claim that a human, and specifically Natsuhi, did it.</p>

<p>This is a pretty specific claim for the ‘mystery’ side (I can’t exactly call them the human side.) They can’t switch to some other potential culprit after this, right? Instead of “Beatrice Dunnit” and NOT(“Beatrice Dunnit”), we have disregarded a lot of the possibility space.</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/90-confession.webp" alt="Beatrice: I, Beatrice, claim... that the culprit in this game is not {y:0:Human}{n:0:human}! I am the culprit!" loading="lazy" />
    
	<figcaption>
		<p>More lawyers should make this face.</p>

		
	</figcaption>
    
</figure>

<p>They make clear that if Beatrice loses, she will be destroyed along with the witch illusions of this game. She is fighting for her life. Also, this would be true of any previous games. (Battler briefly comments that Erika has nothing to lose, but <span class="smallcaps">Virgilia</span> assures him that it will be anything but a good time for her. It really is a thunderdome situation right here.)</p>

<p>So what have we got?</p>

<h3 id="the-murder-of-hideyoshi">the murder of Hideyoshi</h3>

<p>Erika says everyone besides Natsuhi and Hideyoshi were in the same room, the parlour, at this point. This… on the face of it, is kind of obviously not true? Nobody knows where Krauss is, they only know he’s missing.</p>

<p>Anyway, Beato starts with the locked room. Erika says we’ll get to that later, and actually uses the ‘dunnit’ language!</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/91-dunit.webp" alt="Erika: I'll explain the locked room trick—the howdunit—later. We are starting with the whodunit for the time being. ......So for the reason I just mentioned, it's impossible to suspect any character except Natsuhi‐san for the murder of Hideyoshi‐san." loading="lazy" />
    
</figure>

<p>It seems that ‘-dunnit’ has made its way to Japanese: <ruby lang="jp">ハウダニット<rp> (</rp><rt>haudanitto</rt><rp>)</rp></ruby> and <ruby lang="jp">フーダニット<rp> (</rp><rt>fuudanitto</rt><rp>)</rp></ruby> for how- and whodunnit respectively. (Since Japanese doesn’t really have a ‘hu’ phoneme, it has to adapt to the nearest, ‘fu’.)</p>

<p>After a moment consulting with her legal team, Beatrice says that it would be less confusing to proceed chronologically. Bernie immediately objects. Beato counter-objects. Both say ‘objection’ if the pointing pose wasn’t enough earlier…</p>

<p>Battler has a little first-person-narration soliloquy suddenly: this, he thinks, is ‘how the tales of Rokkenjima are created’: by both sides putting forward claims.</p>

<h3 id="the-murder-of-the-four-in-the-guest-house">the murder of the four in the guest house</h3>

<p>Erika sighs and gets on with it. She says Natsuhi had no alibi from when she left until when she returned; a point that apparently merits a text card to declare it.</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/92-argument.webp" alt="A white screen saying 'The culprit is Ushiromiya Natsuhi' in large letters and 'This is because Natsuhi is the only one without an alibi' in smaller ones." loading="lazy" />
    
</figure>

<p>Beatrice’s counters also get nice little summary cards, each one appearing with a dramatic impact. These continue throughout the scene to tell us the main points of each argument.</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/93-counterargument.webp" alt="A white screen saying 'The culprit cannot definitively be said to be Ushiromiya Natsuhi' large and 'As long as there are other people without alibis' small." loading="lazy" />
    
</figure>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/94-elimination.webp" alt="A long list of alternative hypotheses." loading="lazy" />
    
</figure>

<p>I won’t copy out these alternative hypotheses because I suspect that they will get struck down in short order. Indeed, Bernie and Erika promise to do just that.</p>

<p>Erika gets Gohda and Kumasawa to say whether they were in the guesthouse. Gohda confirms he was on duty, Kumasawa says she went to bed in the servants’ quarters there. Natsuhi seizes on this, but Erika says she saw them both go into the servants’ quarters from the lounge and stay there until morning. How’s she going to prove that? Presumably the anti-tamper seals come into play now.</p>

<p>Beato demands proof of the alibis in question. Since her opponents don’t answer to a repetition request, and Erika insists she can fight back on her own without Dlanor, Beato drops a blue:</p>

<blockquote>
  <p><b class="name smallcaps">Beatrice:</b> <span class="blue">Gohda and Kumasawa have no alibis. The two of them were in the guesthouse and could have reached the cousins’ room to commit murder at any time. Unless you can eliminate that possibility, you cannot treat Natsuhi as the culprit</span>.</p>
</blockquote>

<p>It’s interesting that Beato is arguing for a mundane explanation here. She <em>isn’t</em> claiming to have done the murder by magic. But I guess that wouldn’t be consistent with her narrative of working for Natsuhi this game; if she committed the murders on Natsuhi’s behalf, that would still be Natsuhi’s fault, right?</p>

<p>Curiously, Gaap and Ronove say that Erika, as a human, can’t use the red. This seems to contradict the fact that she’s already used it, e.g. to declare herself the detective..? Ah, well, I guess she can’t <em>here</em> at any rate.</p>

<p>Instead, it is indeed the anti-tamper seals. She explains how she sealed the door to the servant quarters after Kumasawa entered. Despite all they said about not using the red, Bernkastel goes ahead and declares it in red anyway:</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> ………<Good>. A wonderful alibi. Absolutely airtight. Kumasawa returned to the guesthouse with Erika, went to the servants' quarters to sleep, and never left the room until morning. <span class="red">In other words, after Kumasawa returned to the guesthouse, she never went to the second floor until morning</span>.</Good></p>
</blockquote>

<p>This red means we can’t quibble about other exits to the servants’ quarters. That has probably been established at some point anyway, and we have Knox forbidding secret doors. (‘Morning’ is slightly ambiguous, mind you, but with the broader context we can probably take Erika’s seal to be decisive..?)</p>

<p>Erika says she sealed Gohda in the servant room in the same way, and when she saw Rosa get back at 1am, informed Gohda she was present. At that time the seal was intact. Afterwards, Gohda hung out with her until 3am, and Erika was watching upstairs after that. (So… she just stayed up all night? Or she’s a very light sleeper?)</p>

<p>This one also gets confirmed in red:</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> ………<span class="red">In other words, after Gohda returned to the guesthouse, he never went to the second floor until morning</span>.</p>
</blockquote>

<p>Is it meaningful that ‘in other words’ is in red? It is a red truth that the red claim is a rephrasing of the information in the previous dialogue?</p>

<p>We are progressing through the checklist. I’ll have to check whether I agree it’s exhaustive but let’s get through this first.</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/95-superhuman.webp" alt="Erika: Thank you very much, my master. ......I am the detective! A being greater than humanss, who can invoke the red truth despite her humanity!" loading="lazy" />
    
	<figcaption>
		<p>Erika gets a little caught up in the moment and decides to become a therian or something.</p>

		
	</figcaption>
    
</figure>

<p>She decides to summarise the positions of everyone. She saw three of the kids alive at midnight, and this gets to be red as well:</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> ………<span class="red">At 24:00 in the guesthouse, George, Jessica, and Maria were alive, and they were in the second‐floor cousins’ room. Nanjo, Gohda, and Kumasawa were on the first floor</span>.</p>
</blockquote>

<p>And also:</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">George, Jessica, Maria, Rosa, and Genji—these five really are dead</span>.</p>
</blockquote>

<p>Though it’s not clear where this is scoped on the timeline! We have that it is impossible to mistake their dead bodies, and that as of this point in the storyline they are dead. <em>However</em>, we don’t actually have that they <em>were</em> dead on the morning when Battler found them. How could that be? Well, maybe the ones who discovered the bodies conspired to deceive Erika about the identity of the bodies. I do not believe she personally got the chance to inspect the bodies up close!</p>

<p>More interestingly, we get a confirmation of the location of some of the others…</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">at 24:00, Natsuhi, Krauss, and Genji were in a corridor on the second floor of the mansion. All the remaining people were at the family conference in the dining hall. Of course, at that point in time, no murder had occurred. Genji was also alive</span>.</p>
</blockquote>

<p>So officially whatever happened happened after midnight—but also we can confirm that Natsuhi, Krauss and Genji were not running about anywhere other than where we saw them at the time of the knock.</p>

<p>Lambda notes this is kind of a freebie, since Erika was not able to observe who was in the mansion.</p>

<p>Battler, silently observing, notes in his first-person narration that Beato must have been going easy on him in the earlier games, being very generous with the red truth repetition requests even when it was ultimately to her disadvantage. Beato (possibly privy to what Battler is thinking?) brings up the ‘incompetent’ line and promises she can handle it.</p>

<p>Nanjo is next up for elimination. He confirms he was with Erika between 1am and 3am, and it gets elevated to red. (Hey, is red truth a monad?)</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">From 1 a.m. to 3 a.m., the trio of Erika, Nanjo, and Gohda… spent their time in the lounge on the first floor of the guesthouse</span>.</p>
</blockquote>

<p>Outside of that? Beato shoots a blue:</p>

<blockquote>
  <p><b class="name smallcaps">Beatrice:</b> <span class="blue">Even so, he shouldn’t have an alibi for the time period before and after you were in the lounge! It was possible for Nanjo to commit the crime too</span>.</p>
</blockquote>

<p>Erika says she met Nanjo on the stairs and talked to him about mystery novels (of course) in the archive until 1am. (Conveniently leaving a window in which she wasn’t watching the guesthouse for the crime to take place?)</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">After 24:00, Erika was with Nanjo the whole time until 3 a.m</span>.</p>
</blockquote>

<p>After 3am, she put one of her seals (she made a lot of them!) on Nanjo’s room. But hold on a minute, what about the window? We know from the events of other episodes that the windows to the guest house can be opened, and unlike the servant quarters, it seems less likely that Nanjo was in a windowless room..? Well, put that on hold for now, because it looks like we’re up to eliminating ‘Battler dunnit’, and this should be interesting.</p>

<p>The window theory ultimately doesn’t matter because we get it in red:</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">Both your seal and your red truth are perfect. Nanjo had the alibi of being with Erika until 3 a.m. And he didn’t leave his room after 3 a.m. until morning</span>.</p>
</blockquote>

<p>Wow, a ‘perfect’! Erika’s really raking in the Good Girl points.</p>

<p>In fact, the question of ‘Battler dunnit’ is raised by the man himself! (Who appears to be operating from the POV of player!Battler rather than piece!Battler right now.)</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/96-maybe-i-dunnit.webp" alt="Battler: ......Hold it, Erika. You're gonna leave me out of this? I'm pretty sure Ushiromiya Battler also had a chance to commit the crime. ......After all, I was in the same room as the victims all night. There's no way I'll let you carry on this discussion while ignoring me. ......?!" loading="lazy" />
    
	<figcaption>
		<p>A nice little hypothetical confession.</p>

		
	</figcaption>
    
</figure>

<p>He gets smacked with the Chiesters’ weapon for speaking out of turn, but Beato does take the suggestion. She doesn’t seem to particularly like it, though.</p>

<p>Beatrice taunts Erika, suggesting that she might have watched Battler sleep to confirm his alibi. Erika calls her bluff, saying that she could <em>hear</em> that nothing significant happened in the guesthouse until Battler woke up and screamed, thanks to the thin wall. And she stayed up all night to do so. The absolute madlass.</p>

<p>I love how contorted the detective’s actions are having to become here.</p>

<p>Bernie explains that she ordered Erika to do this (so she does have a direct line to her pieces in this instance!) and ordered her to listen all night in case Battler was a victim. And of course she’s a ridiculous minmax build with hearing ability ‘on par with a tape recorder’… which isn’t actually that big a boast, really? Tape recorders have pretty crap sound quality compared to the human ear. Well, whatever.</p>

<p>This time, it falls to Lambda to confirm it in red; she says this is an ‘accepted power of the detective’s authority’.</p>

<blockquote>
  <p><b class="name smallcaps">Lambdadelta:</b> <span class="red">Ushiromiya Battler returned to the cousins’ room at 3 a.m. and fell asleep. After that, until the discovery of the crime, absolutely nothing out of the ordinary happened in the room</span>!</p>

  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">In other words, it was impossible for Battler to commit murder or damage the corpses</span>.</p>
</blockquote>

<p>They sure seem to be working together against Beato at this point…</p>

<p>So, that leaves theories involving the group in the mansion taking place between midnight and 3am. We know Erika was not watching the lounge between midnight and 1am. But first we cover the possibility of climbing in from the outside.</p>

<blockquote>
  <p><b class="name smallcaps">Beatrice:</b> <span class="blue">For example, what if someone placed a ladder against the outer wall of the guesthouse and snuck in through a second‐story window?! There must be a way to reach the second floor without passing through the lounge! If this is the case, it would be possible to reach the crime scene without you seeing it</span>…!</p>
</blockquote>

<p>We confirm that there is no stealth route in the building in red pretty quickly:</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">It is impossible for someone to reach the second floor of the guesthouse without anyone in the lounge noticing it. ……Though of course, this only refers to reaching the second floor from inside the building</span>.</p>
</blockquote>

<p>We can have a second ‘of course’ statement add an exception to a previous red statement? Huh.</p>

<p>Erika says she was able to prevent all entry on the second floor. What, did she put seals on all the windows? Feels like we’re getting ‘the devil’s anti-tamper seal’ at this point. <span class="smallcaps">Virgilia</span> says that, for a human, this would be ‘an impossibly dubious action’, but as a witch piece… Erika doesn’t have to worry about such trifling matters, I guess, as motivation or plausible behaviour. The narration starts increasingly calling her a spider.</p>

<p>Erika makes a slightly deranged declaration that, for detectives, someone will die wherever they spend the night, and only third-rate detectives would not prepare this thoroughly. She really is something else. The idea of detectives going about knowing that they have some kind of Elric-ass death curse on them is really funny. And hilarious as an alternative to ‘magic is real’.</p>

<p>All this effort earns her another red statement from Lambda:</p>

<blockquote>
  <p><b class="name smallcaps">Lambdadelta:</b> <span class="red">It was impossible to reach the second floor of the guesthouse without passing through the lounge, and impossible to reach it at all without Erika, who was in the lounge, knowing about it</span>!</p>
</blockquote>

<p>I feel like there’s a possibility that is missing from the checklist. I don’t believe we have had it confirmed in red that the deaths were homicides, right? Let me check… yeah, we didn’t even have the bodies confirmed until later. So, let’s say for example that Rosa killed the three kids between 1am and 3am, and then killed herself. That does leave open the question of where the weapon is, she wouldn’t exactly have time to hide it after cutting her own throat. But this should be on the list…</p>

<p>Erika takes a moment to declare in blue her conclusion so far:</p>

<blockquote>
  <p><b class="name">Erika:</b> <span class="blue">Therefore, the time of the crime is limited to the single hour between midnight, when they were confirmed to be alive, and 1 a.m., when our party in the lounge started</span>!</p>
</blockquote>

<p>(I didn’t catch on to this until later in the chapter, but Erika’s argument is contradictory! If Rosa was in the mansion until 1am, and the crime could only have been committed in this window, there would be no opportunity to kill Rosa at this time. More on this later.)</p>

<p>Bernie repeats the line about the locations of mansion people at 24:00, and also adds:</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">Of all the people in the dining hall, not one of them left the dining hall until 1 a.m.</span></p>
</blockquote>

<p>Notably she doesn’t use any red in relation to the mysterious knock at the door.</p>

<p>Beato demands to know how that can be proved, and gets reminded that red truth is axiomatic:</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">The red truth is simply truth, and there is no need to provide evidence, proof, or room for a counterargument</span>!</p>
</blockquote>

<p>But as we’ve seen, there are restrictions on when you’re allowed to use the red truth if you aren’t the GM. Lambda could freely declare this, but how can Bernie?</p>

<h3 id="the-murder-of-genji">the murder of Genji</h3>

<p>Well, evidently she can, and she is not challenged further. So, Genji then. There’s no argument for this one: Bernie just redtexts it by fiat.</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">When Genji finished transferring the call, he immediately returned to the servants’ quarters</span>.</p>
</blockquote>

<p>This refers to ‘the call’ in red, which suggests there <em>was</em> in fact a call? If not necessarily from Phone Man…</p>

<p>Now, Eva gets called to the stand. (And credited with inventing the seals.) Eva declares that when Rosa left at 1am, Eva put the seal we saw earlier on Genji’s quarters—so either Erika’s signature was a mistake in the art, or she used one of Erika’s spare seals from her apparently unlimited supply. Also red:</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">At 1 a.m., Eva sealed Genji’s sleeping quarters, and that seal was broken by Kanon and Kumasawa in the morning when the crime was discovered<span></span></span></p>

  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">During the short break at 1 a.m., the first two to leave the dining hall were Rosa and Eva. Until Eva returned, everyone in the dining hall remained there. After seeing Rosa off, Eva went to the sleeping quarters and sealed it. Of course, she did not enter the room at all at this time</span></p>
</blockquote>

<p>Erika also adds, as if in answer to my earlier concern, that these are not ‘baseless red truths’ but she got them from the people involved. And apparently she took fingerprints and stuff besides relying on testimony. I immediately start wondering ‘with what equipment’, and…</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/97-scientism.webp" alt="Erika: After all, Kinzo‐san's study is a treasure trove of all kinds of chemicals! I obtained all sorts of scientific evidence, which is truth in its purest form and infinitely close to red truth. However, this isn't a science mystery, so I'll spare you the details." loading="lazy" />
    
</figure>

<p>Sure, we’ll just Devil’s Proof up a forensics kit while we’re at it. The narration lists a few of the alleged investigations: aluminium powder, ‘composition analysis’ on mud, ‘various chemical reactions’ on rainwater. I am reminded of a memorable passage from a book called <cite>Mastering Erotic Hypnosis</cite> by James Gordon and Rebecca Doll (yeah we’ll just put that cite in here :3), which talks about how a hypnotist establishes their narrative sense of authority in the process of building a ‘hypnotic modality’.</p>

<details>
  <summary>On scientific rhetoric in hypnosis</summary>

  <blockquote>
    <h3 class="no_toc" id="paradigm">Paradigm</h3>

    <p>You don’t have a holy book that was handed down by a deity, but you do have a belief that has power within western culture: Science.</p>

    <p>Hypnosis works because of science. That’s why we present some of it at the beginning of this book. We specifically wanted to highlight that modern imaging technology has shown real changes in how the brain works during hypnosis, not because you really need to understand it, but because you need to believe, on a visceral level, that it works. Books lie. Studies can lie. But imaging isn’t really something that you can fake. Either the brain undergoes changes, or it doesn’t.</p>

    <p>You’ll want to have a quick elevator speech on the science of hypnosis and how it works. Convincing people that it is a real, proven, thing will help you create a hypnotic modality. Your basic thesis is simple. Hypnosis is a science and employing it is an art. You have had training in that art because you have read a book which explained hypnosis in a scientific way. Eventually, you may wish to add other classes and certifications to increase both your authority and your perceived understanding of the paradigm.</p>
  </blockquote>

  <p>Of course, me being me, I can’t help but start quibbling the scientific rhetoric. “But imaging isn’t really something that you can fake. Either the brain undergoes changes, or it doesn’t.” The brain changes state with just about <em>any</em> activity and brain scans are notoriously hard to interpret. Determining that there are certain detectable things on an fMRI study which relate to the practice of hypnosis does not really prove very much about their relation to the rest of the structure: ‘going into state’, suggestibility, and so on.</p>

  <p>I happen to think these things, properly nuanced, are useful for understanding some things humans do… but there is an extent to which they are true because brains <em>learn to perform them</em>. It’s not that nature has furnished us with a convenient root access state ‘out of the box’, but it has furnished us with various elements for <em>constructing</em> something that looks like one.</p>

</details>

<p>Which is to say, there is no scientific argument here. Erika is simply gesturing at the epistemic authority which science claims in order to bolster her rhetoric, without doing any of the work by which science (ideally…) earns that cred. The narration highlights that she used Kinzo’s gear without asking—transmuting, in a sense, her abstract ‘detective’s authority’ into a more concrete scientific sense of authority.</p>

<p>So we have now in red:</p>

<blockquote>
  <p><span class="red">Genji never left the mansion after 24:00</span></p>
</blockquote>

<p>which is presumably spoken by Bernie, though it doesn’t actually get put in a speech box.</p>

<h3 id="did-krauss-do-it">did Krauss do it?</h3>

<p>Which just leaves Krauss, and the murder-suicide theory.</p>

<p>Bernie invites Natsuhi to put the blame on Krauss. She refuses. Battler observes that Erika is pretty much just writing the story at this point, and getting it immediately approved by the GM; <span class="smallcaps">Virgilia</span> confirms this is indeed how it works. In other words, this is, right now at least, a <a href="/rpgs/rpgs-as-games-2-goals#blorb-vs-quantum">‘quantum’ game more than a ‘blorb’ game</a>. But the ‘final truth’ here may not be the ‘real truth’.</p>

<p><span class="smallcaps">Virgilia</span> has a little lecture that, even if Erika came by it in a ‘cowardly’ way, her truth is self-consistent and plausible, or it wouldn’t have been able to see so much confirmed in red. But Battler is not in a hurry to accept it this time (even though he was willing to point to various Ushiromiyas as potential culprits at the end of the last game.) It’s kind of an emotional thing:</p>

<blockquote>
  <p>………Even if Erika <em>has</em> accused Aunt Natsuhi of being the culprit, ……and even if everyone else here believes that, ……that’s exactly why I want to be the one person who trusts her…!</p>
</blockquote>

<p>‘Stick up for the underdog’ is something of Battler’s ‘inner law’, here. But also by genre convention, it would be <em>unsatisfying</em> if Natsuhi turned out to have dunnit, so I think Battler is likely to be right. (It seems Krauss is also getting covered by this logic, mind.) But who’s left?</p>

<p>Battler contemplates the difference between truth and consensus. He decides this is just a kangaroo court designed to frame Natsuhi. And he criticises Beato for fighting too defensively, and failing to present a strong counternarrative as an alternative to Lambda. What’s he planning…?</p>

<p>It’s interesting because ‘failing to provide a good story’ has never really been Beato’s problem in the past. Indeed, her magic stories are all so sparkly and full of fun drama that you <em>want</em> to believe in them. She’s really been nerfed in piece form!</p>

<p>Battler, feeling that there should always be someone to argue the opposite case to any belief, contemplates his childhood belief that there was a society on the far side of the moon, a belief he abandoned after ridicule. He starts getting pretty hardcore empiricist with it, saying we should only believe if we’ve seen it ourselves. He further insists that no matter how many red truths are stacked against Natsuhi, he won’t believe she did it.</p>

<p>I feel like this one’s really hard, right? Without going into too much depth, an acquaintance in the sakuga fandom was recently convincingly accused, with extensive evidence, of sexually abusing a young person over a period of years. In a matter of hours he went from a respected member of the subculture to a pariah. The whole affair really threw me for multiple reasons (trust, judgement etc.) which this liveblog is not the place to elaborate. But one is this: I very much do not believe in absolute exile, yet in social spheres, when things break down, people must decide what to do: trust and defend their friends? Cut ties? Try to intervene somehow? People make their choices and the results tend to resolve to schism, exile or apologism, all of which suck. After all sorts of ugly situations, we have not found any generally robust principle. There probably is not one. A lot of infrastructure we might like does not exist.</p>

<p>But Battler’s right about one thing: we don’t have a proper ‘Natsuhi story’ here, and the <i>sente</i> is entirely with Erika right now. Apparently impressed with his resolve, <span class="smallcaps">Virgilia</span> steps in to offer him a freebie red text, as a finite witch and former <span class="smallcaps">Beatrice</span>…</p>

<blockquote>
  <p><b class="name smallcaps">Virgilia:</b> <span class="red">Ushiromiya Natsuhi is not the culprit</span>!</p>
</blockquote>

<p>Oh dang thanks. OK. That does make things a lot easier…</p>

<p>Meanwhile, back in the courtroom, Bernie’s offering Beato a ‘plea bargain’: if she pins it all on Krauss, then Bernie will stop trying to pin it on Natsuhi. I had raised Krauss theories before so this is interesting.</p>

<p>Beato muses that the ‘cat in the box’ is the source of the endless possibilities of an Endless Witch’s power. Body without organs??? Ahem. Anyway because Krauss’s state is so nebulous it’s pretty compatible with witch theories and the game could be a draw.</p>

<p>I don’t think she’s gonna take it, guys. Natsuhi certainly isn’t in a hurry to let her.</p>

<blockquote>
  <p><b class="name">Natsuhi:</b> If you wish to insult me, go ahead! If you wish to ridicule me, do as you please!! But none of you can damage my honor with fiction!!</p>
</blockquote>

<p>Beato has to decide whether to betray her. Ronove and Gaap advise her to do it. Beato raises the question of what will happen to the ‘Natsuhi of this fragment’.</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/98-computer-chess.webp" alt="Throw away that useless pride of yours!! Neither Kasparov nor Deep Blue won every game! The person that wins more games wins in the end, right?! If a witch gets too attached to a single match, a single life, a single piece, ......that witch dies!!" loading="lazy" />
    
</figure>

<p>Gaap mentions Deep Blue vs Kasparov, <a href="https://en.wikipedia.org/wiki/Deep_Blue_versus_Garry_Kasparov">the match</a> that famously established that computers could beat the best human in 1997, which was indeed won 3.5-2.5 by Deep Blue. An interesting example, because in the following decades, computer chess engines kind of left humans in the dust. In any case, Beato alludes to someone (Kinzo?) who stubbornly stuck to their guns…</p>

<blockquote>
  <p><b class="name smallcaps">Beatrice:</b> …………My apologies, ………but I cannot do that. ………I know the strength of a man who believed even though everyone said he was wrong, ……and I know the suffering he went through when he was forced to abandon that belief…!</p>
</blockquote>

<p>She makes an impassioned speech about truth, saying if she can’t defend this truth there is no point to her at all; she certainly has the mindset for a defense lawyer. But I get it. ‘Beatrice who accepted a plea bargain to hold onto “existence”’ would not be <span class="smallcaps">Beatrice</span> any longer.</p>

<p>In response, Bernie officially rule out Krauss.</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> By the name of <span class="smallcaps">Bernkastel</span>, Witch of Miracles, I speak with the red truth. <span class="red">Ushiromiya Krauss is not the culprit. And he was killed long ago. Shortly after you heard his voice over the phone, in fact</span>.</p>
</blockquote>

<p>We do in fact get a death screen to go with this:</p>

<dl>
  <dt>Ushiromiya Krauss</dt>
  <dd>
    <blockquote>
      <p>Murdered sometime after the early morning phone call by which Natsuhi learned he was still alive. His corpse has not been found, but his death has been guaranteed by <span class="smallcaps">Bernkastel</span> with the red truth.</p>
    </blockquote>
  </dd>
</dl>

<p>Very interesting! So that leaves wide open the question of who killed Krauss, because it certainly can’t have been Natsuhi if she was listening to him over the phone. So even if she did some of it (and we now know she did not), that rules out Natsuhi as a <em>sole</em> culprit.</p>

<p>Which means… what? Everyone has an alibi (except for the murder-suicide theory), and we also know Natsuhi didn’t do it. There is no room for Phone Man to exist, since we know from <a href="./chapter-4">chapter 4</a> that</p>

<blockquote>
  <p><b class="name smallcaps">Lambdadelta:</b> <span class="red">Besides [Erika], the number of people on this island is exactly the same as it was in the previous games</span></p>
</blockquote>

<p>Admittedly, there are much fewer alibis for this.</p>

<h3 id="a-verdict">a verdict?</h3>

<p>Anyway, Lambda declares the verdict: Natsuhi killed all six, and since a human dunnit, the court can deny Beato’s existence.</p>

<p>Did Lambda intentionally lose the game to Bernie/Erika, writing her narrative to position the ‘magic side’ to have to disprove a mundane story? Beato never really got much of an opportunity to come up with a decent magic story in this game. And, supposedly, in failing to protect Natsuhi, the witch illusion is dispelled… because, I guess, we’ve ‘proven’ that the story was in fact a mystery all along.</p>

<p>I don’t really buy this. Admittedly, overtly magical acts have been rather thin on the ground in this episode (the bodies disappearing notwithstanding), but that just means that very little about the Beatrice narrative has been put to the test at all. It really doesn’t seem like Lambda was trying very hard to create a magical mystery. On what basis can this game deny Beato’s existence? At best, it shows that Lambda is a pretty weak GM. Given her goal was supposedly to prolong the game indefinitely, throwing it here seems very strange.</p>

<p>Natsuhi and Beato both give speeches about how they still have their honour and so on (the one-winged eagle carved into her heart). Bernie scoffs at her ‘bluster’, and declares she will send a final red truth to crush it. This should be good…</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">Natsuhi. When did Kinzo ever say it was okay for you to engrave the One‐winged Eagle into your heart? Those were just the words of the Kinzo from your delusions. ……The real Kinzo? Throughout his entire life, not <em>once</em>…did he ever trust you from the bottom of his heart, and not once did he ever consider letting you bear the family crest</span>!</p>
</blockquote>

<p>Oh, so <em>that’s</em> what we’re doing.</p>

<p>Appropriately, the music drops out as Bernie delivers this line.</p>

<p>Kinzo (in this case, I suppose you would say introject!Kinzo?) tells Natsuhi not to listen.</p>

<blockquote>
  <p><b class="name">Kinzo:</b> No one can defile the crest engraved in your heart!!</p>

  <p><b class="name">Kinzo:</b> そなたの心に刻まれた紋章は、誰にも汚されぬ！！</p>
</blockquote>

<p>So of course Bernie keeps firing.</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">The real Kinzo would never say such a thing. Begone, you fantasy of Kinzo inside Natsuhi’s mind, beautified by her to suit her own purposes</span>.</p>

  <p><span class="red">Pitiful woman. Now is the time for you to face the truth that you never gained Ushiromiya Kinzo’s trust as long as he lived</span>.</p>
</blockquote>

<p>The narration repeats and emphasises the point: in this game, we only saw Natsuhi’s fantasy of Kinzo. Keep kicking her while she’s down, I guess. She flashes back to the few good times with her family in her shitty life, deciding she no longer has a right to them. Kinzo just sucked that much and yet she can’t take away his authority in her head anymore.</p>

<p>Erika chooses this moment to drop her catchphrase. Everyone claps, though the narration hardly dwells on it.</p>

<p>So… when does Battler get the right to speak up? Because I feel like there is at least one possibility we haven’t played (murder-suicide theory), not that it will do much for Natsuhi now that her entire life has been officially deemed illusory with the full force of narrative authority. Well, we leave the Court and go back to the parlour, where the relatives have accepted that Natsuhi was the culprit. Eva is hit hardest, and she lays into Natsuhi, demanding to know why. Only Battler tries to stop it.</p>

<p>Erika tells Natsuhi that, by the rule of the mystery genre, now the who- and how-dunits have been solved, the whydunit must be provided.</p>

<blockquote>
  <p><b class="name">Erika:</b> Natsuhi‐san. I’ve solved two of the three riddles. The whodunit. The howdunit. The final riddle—the whydunit—must always be confessed by the culprit herself. Please follow the rules of the mystery genre and confess.</p>
</blockquote>

<p>If you’re wondering: <ruby lang="ja">ホワイダニット<rp> (</rp><rt>howaidanitto</rt><rp>)</rp></ruby>…ooh, that one’s really interesting, ‘why’ becomes two syllables here.</p>

<p>Beatrice, invisible to everyone except apparently Erika, protests; she is overruled, because she is not the truth ‘chosen by this world’. On the witch plane, Lambda sneers:</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/100-reasons.webp" alt="Goodbye, Beatrice. .........I made you a witch hoping that you would either become my friend, or help distract me from my boredom. And you've answered my expectations. The second one, that is. ...Eheheheheheheheheheheheheheh!!" loading="lazy" />
    
</figure>

<p>Fuck you I am a witch whether you say so or not, says Beato (paraphrasing); Lambda says something <em>very interesting</em> in retort…</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> You wouldn’t even have been capable of believing that if I hadn’t become your guardian in the first place…!!</p>
</blockquote>

<p>The word ‘believing’ is interesting, here. What does ‘guardian’ mean in this context? Going with the theory that this all goes back to Kinzo’s creepy orphanage somehow, and the theory of witches as people who hold elaborate fantasy ‘inner worlds’, could there be a real-world counterpart to Lambda who introduced the real-world counterpart of Beato to the practices of ‘witchcraft’..?</p>

<p>In any case, Beato lost, so by precedent it’s goat time. If you’re gonna do anything, Battler, now would be a fantastic time! There’s a cute little exchange:</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> Let me hear some nice screams. You’re a bottle of wine we’ve been saving for this day.”</p>

  <p><b class="name smallcaps">Beatrice:</b> ……Then remaining silent will be my final strike back at you…</p>

  <p><b class="name smallcaps">Bernkastel:</b> Yes! I made her say it! Uhihihahaaah!! The screams of those who gift me that line as their parting shot are the most gratifying of all!</p>
</blockquote>

<p>Ha, remember when we thought Bernkastel was the nice witch?</p>

<h3 id="battlers-turn">Battler’s turn</h3>

<p>Suddenly someone cuts through the goats as they’re all chewing Beato… Battler? Nope. It’s… <em>Dlanor</em>!! Well, well, well…</p>

<p>Dlanor announces that someone—Battler, of course—has an objection. She warns him, though, that the court does have a time limit. (I’ve been reading this chapter all day lol, so probably quite a long one…)</p>

<p>Battler still feels like he has no idea what happened and it will be hard to present a counter-truth… but he has to improvise somehow. Bernie is pretty thrilled about this turn of events, evidently expecting him to go down quickly.</p>

<p>Despite intervening to let him join the fight, Dlanor is going to be his opponent. She gets all catte with it…</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/101-catte.webp" alt="As you wish. Glory be to the great Lady Bernkastel! I am the Chief Inquisitor, Dlanor A. Knox...!! Step forward, Ushiromiya Battler!!" loading="lazy" />
    
</figure>

<p>Battler’s initial line of attack is the seals. Of course, since we have had most seal evidence confirmed with red truth by this point, it doesn’t seem like there is a ton of point arguing the seals could be replaced.</p>

<p>But, let’s see, some options: first up, Eva. It took me a second to notice this, but we already know that she received some seals of her own from Erika and is aware of Erika’s seal-based plan, so she would have the opportunity to replace broken seals with intact ones. It’s the <a href="https://en.wikipedia.org/wiki/Confused_deputy_problem">confused deputy problem</a>… or in this case, the evil deputy problem. Indeed, Eva might have intentionally told Erika about the idea of seals in order to set her up to exploit them for alibis.</p>

<p>Battler’s initial blue doesn’t quite go that far. He suggests that someone noticed the seal and replaced it.</p>

<blockquote>
  <p><b class="name">Battler:</b> <span class="blue">Can’t we doubt the reliability of these seals of Erika’s?! Something like wedging some paper in a door can’t create a perfect alibi! It might be that someone noticed by chance and happened to put it back in the same place</span></p>
</blockquote>

<p>Erika counters that the seals are made with perforated duct tape and signed personally by her, consistent with the one CG we got of them. So, yeah, I think I’m onto something with the Eva thing. Anyway, let’s get the initial exchange, a red-blue volley:</p>

<blockquote>
  <p><b class="name">Dlanor:</b> <span class="red">Due to the above, the seals are guaranteed to be <span class="smallcaps">perfect</span>. Miss Erika’s seals were not broken by anyone, and deception is <span class="smallcaps">impossible</span>!!</span></p>

  <p><b class="name">Battler:</b> <span class="blue">I’ll acknowledge Erika’s seals…! However, Auntie Eva’s seal on Genji‐san’s room should be different</span>!!</p>

  <p><b class="name">Dlanor:</b> <span class="red">Eva’s seal was of the same type as Miss Erika’s. That is because this method of sealing was one that Miss Erika and Eva conceived of together after <span class="smallcaps">dinner</span></span>.</p>
</blockquote>

<p>‘The same type’ huh…</p>

<blockquote>
  <p><b class="name">Battler:</b> <span class="blue">Erika fished through the chemicals in Grandfather’s room saying she’d use them for forensic testing, right?! There might have been some kind of solvent among them!! If you used that, you might be able to tear off the duct tape without leaving fingernail marks</span>!!</p>

  <p><b class="name">Gertrude:</b> For your attention: I beg to inform you of the following: <span class="red">It is impossible to tear off any of the seals by any method without leaving marks</span></p>

  <p><b class="name">Cornelia:</b> FYAIBTIYOTF: <span class="red">There were no suspicious marks on any of the seals</span></p>
</blockquote>

<p>Very carefully worded. If you put a fresh untampered seal where a broken seal was, you would cover up the marks left by the previous seal, I think? Though Bernie takes it a step further:</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">All of Erika and Eva’s seals… were not tampered with in any way that hindered their ability to act as seals, such as being scraped off</span>.</p>
</blockquote>

<p>Taken literally this would probably rule out removing and replacing a seal.</p>

<p>Battler says he has something, but he left it ‘at home’. He says he would never break his promise to kill Beato; that he never breaks promises. Beato says that’s a lie. It seems it might be time to address the ‘sin’, then?</p>

<p>No, Beato just loses her shit and tells the other witches to finish the job.</p>

<h3 id="knox-speedrun">Knox% speedrun</h3>

<p>Battler starts getting desperate. He fires off a rapid series of challenges, all of which go against one or another of Knox’s rules. Since basically every line of dialogue in this section is red or blue I have to quote the lot. In between we go through just about all the red/blue VFX clips in the game’s entire library.</p>

<details>
  <summary>complete volley</summary>

  <blockquote>
    <p><b class="name">Battler:</b> <span class="blue">I postulate a method X that could lead someone to the upper floor of the guesthouse without passing through the lounge! Erika claims that the windows and such were sealed, but she can’t prove that she sealed all possible means of entry! There’s a possibility that Erika was unable to seal entrance X because she couldn’t find it</span>!</p>

    <p><b class="name">Dlanor:</b> <span class="red">Knox’s 3rd: It is forbidden for hidden passages to <span class="smallcaps">exist</span>! As the detective, Miss Erika sealed all <span class="smallcaps">entrances</span>. Passages that the detective cannot find are hidden <span class="smallcaps">passages</span>. Therefore, there are no entrances that Miss Erika cannot <span class="smallcaps">find</span></span>!!</p>

    <p><b class="name">Battler:</b> <span class="blue">I present the possibility that Erika’s lookout in the lounge wasn’t perfect!! During the two hours Erika spent there, did she really observe everything without looking away for a second?! It might have been possible for someone to pass through the lounge during a small window of opportunity when Erika at least wouldn’t have seen them</span>!!</p>

    <p><b class="name">Gertrude:</b> FYAIBTIYOTF: <span class="red">Lady Erika’s lookout in the lounge was perfect. There were no small gaps or carelessness or times when she looked away for even a second</span>.</p>

    <p><b class="name">Cornelia:</b> FYAIBTIYOTF: <span class="red">Therefore, during their entire meeting in the lounge, only Rosa went up to the second floor</span>!</p>

    <p><b class="name">Battler:</b> <span class="blue">But was that really Auntie Rosa herself?! There’s a possibility that someone disguised themselves as Auntie Rosa!! Or maybe she was actually holding a large suitcase with someone hiding inside it</span>!</p>

    <p><b class="name">Dlanor:</b> <span class="red">Knox’s 10th: It is forbidden for a character to disguise themselves as another without any <span class="smallcaps">clues</span>! There was no foreshadowing suggesting that someone might be disguised as Rosa! Furthermore, Erika verified that Rosa was not carrying any luggage large enough to hide a human <span class="smallcaps">being</span></span>!</p>

    <p><b class="name">Battler:</b> <span class="blue">Aunt Natsuhi was being threatened by someone!! The uninvited, unknown guest X is the true culprit!! How can you be sure that we are the only ones on this island?! The true culprit is someone else</span>!</p>

    <p><b class="name">Dlanor:</b> <span class="red">Knox’s 1st: It is forbidden for the culprit to be anyone not mentioned in the early part of the <span class="smallcaps">story</span></span>!!</p>

    <p><b class="name">Battler:</b> <span class="blue">Maybe they were killed with poison in a remote murder!! Umm, ……with a strange drug that can make a cut appear in the victim’s neck when they die…!! The poison used has a delayed effect, so even with an alibi—</span></p>

    <p><b class="name">Dlanor:</b> <span class="red">Knox’s 4th: It is forbidden for unknown drugs or obscure scientific devices to be <span class="smallcaps">used</span></span>!!</p>

    <p><b class="name">Battler:</b> <span class="blue">There’s a chance that there existed a murder device X in the cousins’ room and Genji‐san’s quarters that made a remote murder possible…!! It used a secret mechanism that still hasn’t been discovered to—</span></p>

    <p><b class="name">Dlanor:</b> <span class="red">Knox’s 8th: It is forbidden for the case to be resolved with clues that are not <span class="smallcaps">presented</span></span>!!</p>

    <p><b class="name">Battler:</b> <span class="blue">I just know there exists a true culprit other than Aunt Natsuhi!! If you deny that, then for each character, repeat in red that they aren’t the culprit</span>!!</p>

    <p><b class="name">Dlanor:</b> <span class="red">Knox’s 6th: It is forbidden for accident or unaccountable intuition to be employed as a detective <span class="smallcaps">technique</span></span>!!</p>

    <p><b class="name">Battler:</b> <span class="blue">You say that everyone except Aunt Natsuhi has an alibi?! You’re forgetting one!! Who’s gonna prove that Erika herself has an alibi</span>?!!</p>

    <p><b class="name">Dlanor:</b> <span class="red">Knox’s 7th: It is forbidden for the detective to be the <span class="smallcaps">culprit</span></span>!!</p>

    <p><b class="name">Battler:</b> <span class="blue">Unless she’s caught red‐handed, you should never be able to deny the possibility that Aunt Natsuhi is innocent!! Can you even deny future possibilities, like if a piece of evidence X that Erika hasn’t discovered proves Natsuhi’s innocence</span>?!</p>

    <p><b class="name">Dlanor:</b> <span class="red">Knox’s 8th: It is forbidden for the case to be resolved with clues that are not <span class="smallcaps">presented</span></span>!!</p>

    <p><b class="name">Battler:</b> <span class="blue">Th‐this story is full of malicious fiction!! The story itself is a trap designed to frame Aunt Natsuhi! We should reconstruct the story from impartial truths alone</span>!!</p>

    <p><b class="name">Dlanor:</b> <span class="red">Knox’s 9th: Observers are permitted to put forward their own conclusions and <span class="smallcaps">interpretations</span></span>!</p>

    <p><b class="name">Battler:</b> <span class="blue">Maybe I was the culprit, and I gave George‐aniki and the others a slow‐acting poison to make them die after midnight, then silently slit their throats when I returned at {nobr:3 a.m.}!! I could have done it so quietly that Erika wouldn’t hear</span>…!!</p>

    <p><b class="name">Dlanor:</b> <span class="red">Knox’s 8th: It is forbidden for the case to be resolved with clues that are not <span class="smallcaps">presented</span></span>!!</p>

    <p><b class="name">Battler:</b> <span class="blue">Everyone committed suicide…!! So there is no culprit</span>!!</p>

    <p><b class="name">Gertrude:</b> FYAIBTIYOTF: <span class="red">All deaths were homicides</span>.</p>

    <p><b class="name">Battler:</b> <span class="blue">Erika didn’t personally examine the corpses, right?! It should be possible for people who aren’t the detective to make a mistake when examining the corpses</span>!!</p>

    <p><b class="name">Cornelia:</b> FYAIBTIYOTF: Be advised that <span class="red">no examination of any corpse is ever mistaken</span>!</p>

    <p><b class="name">Battler:</b> <span class="blue">Then maybe there were body double corpses!! They prepared corpses beforehand that closely resembled the victims</span>…!!</p>

    <p><b class="name">Gertrude:</b>Be advised that <span class="red">no corpses exist except those of characters who have appeared in the story</span>.</p>

    <p><b class="name">Battler:</b> <span class="blue">Th‐then how can you claim that Uncle Krauss is dead without his corpse?!! Doesn’t that violate Knox’s somethingth or whatever</span>?!!</p>

    <p><b class="name">Cornelia:</b> Be advised that <span class="red">the red truth is simply truth, and there is no need to provide evidence or proof</span>!!</p>
  </blockquote>

</details>

<p>So we’ve scored Knox 3, 10, 1, 4, 8, 6, 7, 8, 9, 8… sorting that, 1, 3, 4, 6, 7, 8, 9, 10. That leaves 2 (no supernatural effects) and 5 (the racist one). Using 2 would amount to conceding the game, and the less said about 5 the better, so I think this is a reasonable 100%.</p>

<p>The important additional clues here are:</p>

<blockquote>
  <p><b class="name">Gertrude:</b> FYAIBTIYOTF: <span class="red">All deaths were homicides</span>.</p>
</blockquote>

<p>That rules out Rosa killing everyone and then herself.</p>

<p>We have a few more ‘Umineko versions’ of the Knox rules.</p>

<blockquote>
  <p><b class="name">Dlanor:</b> <span class="red">Knox’s 1st: It is forbidden for the culprit to be anyone not mentioned in the early part of the <span class="smallcaps">story</span></span>!!</p>
</blockquote>

<p>Knox put this as:</p>

<blockquote>
  <p>The criminal must be mentioned in the early part of the story, but must not be anyone whose thoughts the reader has been allowed to know.</p>
</blockquote>

<p>This would actually rule out Natsuhi as the culprit, since we’ve had a few scenes from her first-person perspective already! I’m not sure if the latter clause was purposefully elided, or if it just doesn’t apply to Umineko.</p>

<blockquote>
  <p><b class="name">Dlanor:</b> <span class="red">Knox’s 6th: It is forbidden for accident or unaccountable intuition to be employed as a detective <span class="smallcaps">technique</span></span>!!</p>
</blockquote>

<p>Knox originally put this:</p>

<blockquote>
  <p>No accident must ever help the detective, nor must he ever have an unaccountable intuition which proves to be right.</p>
</blockquote>

<p>So this one’s a pretty close translation for once.</p>

<p>Then there’s this exchange:</p>

<blockquote>
  <p><b class="name">Battler:</b> <span class="blue">Th‐this story is full of malicious fiction!! The story itself is a trap designed to frame Aunt Natsuhi! We should reconstruct the story from impartial truths alone</span>!!</p>

  <p><b class="name">Dlanor:</b> <span class="red">Knox’s 9th: Observers are permitted to put forward their own conclusions and <span class="smallcaps">interpretations</span></span>!</p>
</blockquote>

<p>Knox put this:</p>

<blockquote>
  <p>The “sidekick” of the detective, the Watson, must not conceal from the reader any thoughts which pass through his mind: his intelligence must be slightly, but very slightly, below that of the average reader.</p>
</blockquote>

<p>We don’t have a “sidekick” character per se. Our main POV character, Battler, does constantly get <em>told</em> he’s stupid and incompetent, but he’s not really in a Watson role at all. Then again, the convention is definitely that Battler will not solve a mystery within the episode in order to give us time to figure it out ourselves. But who knows…</p>

<h3 id="can-we-solve-it-for-real">can we solve it for real?</h3>

<p>So, with all that, the dust is settling. Battler says he has one last thing. Let me pause him a second… because I feel like we should have enough to come up with a solution for this episode now. A positive truth that can make sense of the whole affair. Let’s take stock…</p>

<ul>
  <li>Natsuhi does insist that she was being blackmailed</li>
  <li>by all accounts there was no possible way for the knock to happen at the door at midnight, but perhaps everyone there could be implicated in a conspiracy to claim someone knocked</li>
  <li>it is possible, if a little of an edge case, that Eva is able to duplicate Erika’s seals.</li>
</ul>

<p>Despite a redtext that comes pretty damn close to denying it, the last one stands out to me, since it feels like it <em>was</em> a clue that was set up earlier in this chapter. We know Eva knows about the seals, we know that she knows what Erika’s seals look like, and the art for that scene very clearly showed Erika’s signature and not Eva’s.</p>

<p>Let’s check what actual red text we have about Genji.</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">When Genji finished transferring the call, he immediately returned to the servants’ quarters</span>.</p>
</blockquote>

<p>Hold on, now… when was that? That sounds like it was <em>before</em> 1am.</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">At 1 a.m., Eva sealed Genji’s sleeping quarters, and that seal was broken by Kanon and Kumasawa in the morning when the crime was discovered<span></span></span></p>

  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">During the short break at 1 a.m., the first two to leave the dining hall were Rosa and Eva. Until Eva returned, everyone in the dining hall remained there. After seeing Rosa off, Eva went to the sleeping quarters and sealed it. Of course, she did not enter the room at all at this time</span></p>
</blockquote>

<blockquote>
  <p><span class="red">Genji never left the mansion after 24:00</span></p>
</blockquote>

<p>So when did ‘Genji finish transferring the call’? According to the narration, which we seem to have had confirmed by the red text placing him in the hall upstairs at midnight, Genji was presenting Natsuhi with the phone just as the clock struck midnight.</p>

<p>OK. Genji returns to the servants’ quarters after that. He has an opportunity at this point to move around and do other stuff, as long as he’s back in there by 1am and does not leave the mansion. For example, he could abduct Krauss. It would be difficult for him to play the role of Phone Man, though, if we believe the narration that showed him passing the phone to Natsuhi in person.</p>

<p>There’s another problem here. We’ve spent this whole chapter establishing the murders must have happened while Erika wasn’t in the lounge, which is the period between midnight and 1am. But we’ve also established that Rosa went back at 1am and met Erika on the stairs, right? And from that point until 3am, Erika was watching the lounge? So when was Rosa killed? Even if a culprit had entered the building while Erika was in the archives, and carried out the murder between 1am and 3am, they would not have had the opportunity to slip away.</p>

<p>When was Krauss last heard alive? Significantly later than the others: in Chapter 10, around when the bodies are being discovered. On top of that, someone must be playing as Phone Man at this point.</p>

<p>OK, so we shouldn’t assume that there is only one culprit. here’s some ideas. we must assume, since we’re playing for Beatrice, that neither Natsuhi nor Krauss killed anyone. but anyone else except Erika is fair game, even Battler.</p>

<ul>
  <li>for some reason, the group of relatives in the hall decide to carry out a series of murders. probably something to do with the inheritance</li>
  <li>Rosa is dispatched to deal with the group in the guest house. She meets Erika on the way in, and goes upstairs while Erika, Genji and Nanjo hang out in the lounge. Rosa kills George, Jessica and Maria. but then who kills Rosa?</li>
  <li>Eva is dispatched to deal with Genji. we know she does not enter the room and it wasn’t a suicide. it is possible she opened the door, attacked him across the threshold, and then closed and sealed it afterwards?</li>
  <li>it is also possible that someone else entered the room prior to 1am and killed Genji. while Gohda and Kumasawa are sealed away, and the rest were in the dining room, it is entirely possible for one of the kids to <em>leave</em> the guesthouse while Erika is talking to Nanjo, enter the mansion, kill Genji, and return with Erika none the wiser.</li>
  <li>who didn’t show up at the body discovery scene? mostly the servants in the mansion it seems like (Kanon, Gohda, Kumasawa and Sayo) who all seem to have left the mansion prior to Battler waking up. and Natsuhi and Krauss of course.</li>
  <li>at some point after the body discovery scene, the bodies are moved to an unknown location by an unknown party. this is so far entirely unaddressed.</li>
  <li>there was no noise until Battler screamed at 7am. shortly after this, people came running, and Erika ran off to check the whole guesthouse for anti-tamper seals. in this period, there is a small window where someone (Battler perhaps) could carry out murders</li>
</ul>

<p>Hang on, when did the servants get up? clearly prior to the bodies being discovered. if Erika was listening closely at the wall until Battler screamed as she claims, how could she also be verifying that the seals were unbroken?</p>

<p>Here’s another oddity. In describing the bodies, the game often uses modal constructions with <em>could</em>. For example, we have</p>

<blockquote>
  <p><span class="red">anyone looking at George, Jessica, Maria, Rosa, or Genji’s corpses could confirm at a glance that they are dead</span>.</p>
</blockquote>

<p>Which doesn’t mean that anyone <em>did</em> look at the corpses and confirm they are dead. It’s possible they looked at something else and pretended. Even in this episode, we have:</p>

<blockquote>
  <p><b class="name">Cornelia:</b> <span class="red">no examination of any corpse is ever mistaken</span>!</p>
</blockquote>

<p>How would this work exactly? Well, let’s say the “corpses” are playing dead in the morning at 7am when Battler wakes up. He pretends to scream in fright. This is part of a pre-planned conspiracy, designed to keep Erika busy. The other relatives from the dining hall are in on it, same as the knock thing.</p>

<p>So while I don’t have a conclusive counter-narrative yet, here are some points to use:</p>

<ul>
  <li>the murder of Rosa, at least, cannot have happened before 1am. if there can be no murders after 3am, someone must have entered the guesthouse and waited for Rosa to come upstairs.</li>
  <li>it is possible that someone <em>left</em> the guesthouse as well as entered it; this may account for Genji’s death.</li>
  <li>where is Krauss being held when Phone Man calls Natsuhi around 7:30am? and by who?</li>
  <li>the anti-tamper seals and corresponding red guarantees last until a nebulous ‘morning’. it seems that the servants leave the guesthouse prior to the bodies being discovered, perhaps to kidnap Krauss</li>
  <li>who moved the bodies? during the 7am to 8am period, there’s a lot of running around and perspective jumps, so I’m kind of hazy on where everyone goes</li>
</ul>

<p>Since moving four bodies would probably require a few people to be involved, especially to do so without Erika noticing, this would also suggest a big conspiracy. Possibly a close reading could confirm where Erika’s POV is.</p>

<p>With this in mind, here’s a really convoluted counter-narrative which nevertheless accounts for more of the events than Erika’s story:</p>

<ul>
  <li>the relatives in the dining hall aren’t confident of their claim on the inheritance. they conspire to make up the story about the knock, and this sets the ball rolling for further conspiracies.</li>
  <li>some or all of them decide that framing Krauss and Natsuhi for murder would be a good way to get them out of the way.</li>
  <li>the conspirators—whoever they are—kidnap Krauss during the night, and take him to an unknown location.</li>
  <li>to stitch up Natsuhi, Eva conspires to introduce Erika to a ‘foolproof’ way to guarantee alibis.</li>
  <li>Genji may also be playing dead, or else he caught wind of the conspiracy and had to be killed. after killing him without entering the room, Eva seals the door.</li>
  <li>meanwhile, Rosa enters the guest house and informs the kids that they need to play a trick on Erika. (alternatively, she kills them.) Battler is already in on the plan. perhaps they use the betel nuts, established early on as resembling blood.</li>
  <li>in the morning, Battler wakes up and ‘discovers’ that the room is full of dead bodies. he pretends to panic, causing the other relatives to come running. everyone already knows who (if anyone) is actually dead, so nobody is ‘mistaken’.</li>
  <li>Erika does not examine the bodies as noted, so she does not know they are faking their deaths.</li>
  <li>everyone moves to the mansion after the alarm is raised. after they’ve gone, the ‘dead’ bodies get up and start moving independently. someone pretends to be ‘phone man’ in order to terrify Natsuhi into compliance.</li>
  <li>they assist Erika in running around establishing everyone’s alibis, feeding her a consistent set of yarns in order to point the finger at Krauss and Natsuhi.</li>
  <li>at some point prior to Erika’s parlour scene, the group who faked their deaths actually die for real. maybe the conspiracy collapses, or it’s an accident. maybe Krauss breaks free and they all kill each other.</li>
</ul>

<p>That still leaves a pretty big question: why did they kill Hideyoshi, and why arrange for Natsuhi to be in the room when Hideyoshi is killed? I don’t have a great answer for that.</p>

<h3 id="battlers-last-gasp">battler’s last gasp</h3>

<p>Lets see which Battler uses. We get some buildup. He doesn’t have an alternative truth to present, but he can at least prove it was not Natsuhi. The way he’s talking, he’s about to do a heroic sacrifice.</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/102-double-standard.webp" alt="Battler: ......Well, ......it looks like I'll have to break my promise to kill you after all." loading="lazy" />
    
</figure>

<p>He declares the red truth that <span class="smallcaps">Virgilia</span> gave him: <span class="red">Ushiromiya Natsuhi is not the culprit</span>. Unfortunately, Dlanor pops out her caestus and hits the parry window without skipping a beat.</p>

<blockquote>
  <p><b class="name">Dlanor:</b> <span class="red">Knox’s 2nd: It is forbidden for supernatural agencies to be employed as a detective <span class="smallcaps">technique</span></span>.</p>
</blockquote>

<p>So we do get Knox 2 after all. I kind of thought we’d already done ‘using the red as evidence’ in the volley above, but I guess this is subtly distinct from the previous rule that framed it as an intuition.</p>

<p>This feels a bit odd: we have been forming all manner of inferences based on the red, which is without a doubt using ‘supernatural agencies as a detective technique’, but I guess most of those inferences were not <em>declared in red</em>, and that’s when Knox kicks in.</p>

<p>So Battler’s gonna like, die?</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/103-deaths.webp" alt="Dlanor says the word 'death' in red a whole bunch of times." loading="lazy" />
    
	<figcaption>
		<p>Dlanor sure seems to think so.</p>

		
	</figcaption>
    
</figure>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/104-deathphrase.webp" alt="Dlanor: &lt;Die the death&gt;. &lt;Sentence to death&gt;. &lt;Great equalizer is the death&gt;!" loading="lazy" />
    
	<figcaption>
		<p>Sure Dlanor, it’s just a job…</p>

		
	</figcaption>
    
</figure>

<p>We get a whole CG of Battler getting impaled on a big two-pronged red spear like the good old Lance of Longinus…</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/105-longinus.webp" alt="CG of Battler being impaled on two long red spears that extend out of frame." loading="lazy" />
    
</figure>

<p>And Dlanor gets to wrap things up with her version of Natsuhi’s ‘whydunit’. With her authority(TM), she broke the locks on Natsuhi’s diary (how convenient, not at all ‘third rate’).</p>

<p>Natsuhi’s marriage, she says, was more like a hostage situation; Natsuhi described it as such in her own words. Kinzo, we are told, economically crushed Natsuhi’s noble family as a way to force them to agree to a marriage, in order to raise his standing as an ‘upstart’ among the rich. Natsuhi, we are told, was raised by Shinto priests, and they would have been utterly humiliated by the affair.</p>

<p>Natsuhi protests: despite this fucked situation, Krauss was kind and understanding. Erika quotes her diary back at her, saying she didn’t trust it. Natsuhi protests she came around, and just didn’t write it down.</p>

<p>Erika’s response is comically… Erika.</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/106-internal-authority.webp" alt="Erika: Multiple diverse pieces of evidence and testimony... make it clear that you had an intense hatred for your husband. On the other hand, your claim, that you eventually accepted his feelings, is unsupported by evidence." loading="lazy" />
    
</figure>

<p>I can see why she called herself an ‘intellectual rapist’. Natsuhi isn’t even being allowed authority over narrating her own thoughts and feelings anymore.</p>

<blockquote>
  <p><b class="name">Erika:</b> Nothing can be trusted except for red truth…!! Statements that aren’t red don’t count as evidence at all, and they can’t be trusted at all! All text that is not red is a falsehood that exists to deceive me!!</p>
</blockquote>

<p>…which seems like it’s directly aimed at the attitude the reader has probably reached by this point (certainly expressed at various points in this liveblog), of assuming that all the narration not directly verifiable by the presence of Battler (or now Erika) or backed up in red is probably a smokescreen of some kind. So, well played, Ryuukishi…</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/107-unnecessary.webp" alt="Romance is unnecessary for a detective. I don't think I've ever used the word 'romance' except to explain the motive for murder." loading="lazy" />
    
	<figcaption>
		<p>She’s so much…</p>

		
	</figcaption>
    
</figure>

<p>As if to reassure themselves, everyone expresses their pitying thoughts on what a sorry thing Natsuhi’s life has been—never mind what she thinks about the matter. Even Battler—now presumably severed completely from his player—starts to wonder if Natsuhi was the one that dunnit.</p>

<p>But then Erika throws us a little surprise. She says there’s one person that could still have done it… Kinzo. Because, on this level of reality, it is not yet proven that he’s dead. Which means Natsuhi could try to pin it on Kinzo—at which point Erika can of course reveal that Kinzo is already dead and ‘prove’ that Natsuhi is a liar who hates the Ushiromiyas, right? Of course, if she refuses the bait, Erika can spin that as a confession.</p>

<p>Abruptly, we are back in court. We already have Kinzo’s death down in red, but Bernkastel wants a perfect victory, which means Natsuhi must resign.</p>

<p>Bernie says:</p>

<blockquote>
  <p>“Lambda. I’m going to make Kinzo’s location from midnight until the morning absolutely clear. ……<span class="red">From midnight until morning, Kinzo stayed in the same room</span>.</p>
</blockquote>

<p>Lambda decides to let her cook after a moment of confusion. So, defining ‘Kinzo’ to mean ‘a living Kinzo’, Bernie continues:</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">Kinzo does not exist anywhere outside the mansion</span>.</p>
</blockquote>

<p>Are you about to tell me she searched the entire damn island? Apparently, yes: Erika searched, and because she is the detective she must necessarily find any relevant clues per Knox, but there weren’t any, QED. I feel like if you’ll fall back on that you might as well just plonk Erika down anywhere and not bother with all the running about sticking tape on things… the detective in a mystery story has to at least justify their discovery of clues by some effort to make it plausible.</p>

<p>Anyway, they drag it out a bit, eliminating every location Kinzo might be one by one. Once again I can’t help but think of <cite>Green Eggs and Ham</cite>.</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">Kinzo is nowhere outside the mansion. Kinzo isn’t on the third floor. Kinzo isn’t in the basement. Kinzo isn’t on the first floor. Therefore, the only place Kinzo could possibly exist is the second floor</span>.</p>
</blockquote>

<p>Then, after a room by room search:</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">Kinzo does not exist outside Natsuhi’s room</span>.</p>
</blockquote>

<p>The contrapositive comes up (as Hempel’s raven, we won’t get into all that again.) Erika mentions that he might have left again by the window… but couldn’t he use the classic hide-and-seek strat of moving around behind the searcher, e.g. down the stairs? Lookouts have yet to be mentioned.</p>

<p>Hey, you know, since we’ve observed that Kinzo’s quantum location is limited to Natsuhi’s room, that leaves his momentum highly uncertain! We’ll find him shooting through the mansion like a bullet! …ok yeah nevermind</p>

<p>Since we have the arbitrary declaration that he did not change rooms, and Erika was apparently checking for evidence of where he’d been, we get that…</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">For the entire duration of the night between midnight and morning, a living Kinzo could not have existed anywhere outside Natsuhi’s room</span>.</p>
</blockquote>

<p>And then, after one more refusal… they go ahead and accuse her of incest (or something akin to it). Quite explicitly. Jesus lmao.</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">For the entire duration of the night between midnight and morning, a living Kinzo could not have existed in any place except inside your bed</span>.</p>
</blockquote>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="red">For the entire duration of the night between midnight and morning, a living Kinzo could not have existed in any place except inside Natsuhi’s bed. And last night, Natsuhi also slept in that same bed</span>.</p>
</blockquote>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> <span class="blue">Therefore, we can conjecture that Ushiromiya Natsuhi and Ushiromiya Kinzo had sexual relations with each other. Why else would a man and a woman share the same bed all night long</span>?</p>
</blockquote>

<p>There is a great deal of cruelty in Umineko, but it is kind of impressive how far these two can take their vindictive games. This Natsuhi humiliation train just doesn’t stop. And for all that Erika makes big talk about solving mysteries, she is evidently <em>extremely</em> willing to use selective evidence to tell whatever story she damn well pleases (if all the ‘scientific’ evidence she pulled out of her arse this episode weren’t evidence enough of that.)</p>

<p>Natsuhi is stubborn to the last, so Bern adds…</p>

<blockquote>
  <p><b class="name smallcaps">Bernkastel:</b> “He’s not one of the dead. We’re talking about the honor of a convenient delusion inside Natsuhi’s head. ……<span class="red">The real Kinzo never once ordered Natsuhi…to do anything like protect his honor</span>.”</p>
</blockquote>

<p>With that, Bernkastel gets declared the victor—and apparently gets the right to write the ending for this fragment out of it. And that’s the chapter end, so I guess we’ll see whatever cursed epilogue she has in mind next time.</p>

<hr />

<p>Bloody hell.</p>

<p><cite>Umineko</cite> can get pretty damn mean with it at times, huh.</p>

<p>Battler and Beato are both…dead? This is not the first time Battler has died, but this seems a bit more final. Obviously, the <em>story</em> isn’t over, but maybe this pirate dude is gonna come in and replace Battler for a while? I was discussing <cite>Umineko</cite> with someone IRL recently (at the Glasgow Leatherdykes pub night, where else) and she implied there would be some kind of major twist still to come, so I am kind of wondering if this might be it.</p>

<p>I’ll save further comments on Natsuhi until after the next chapter, since it seems like there is more to come here. But I definitely feel things about someone getting overwritten with some other narrative of their life than their own (she says, transgenderly). Poor Natsuhi. This chapter has just been gratuitously brutal towards her.</p>

<p>I’m not confident in every detail of the counter-narrative here. I do feel like I may have caught some of the tricks, though. I’ll be quite interested to find out what the real solutions are in a couple of episodes.</p>

<p>Also seems notable that if I <em>am</em> right about this counter-narrative or anything similar, it wouldn’t be much good for <span class="smallcaps">Beatrice</span> getting to exist, because it’s also a mundane narrative. The problem is, the magic narrative has almost nothing to go on in this episode. We get too many POV scenes of <span class="smallcaps">Beatrice</span> and co. floundering to come up with a next move. Where are the incredible plays we saw in the previous games? Well, of course, the actual player!<span class="smallcaps">Beatrice</span> is no longer in control here. Without omniscience, it’s a bit harder to pull that kind of thing off.</p>

<p>OK, well, this has been a lot more of an Umineko day than I ever planned, but I’m glad to be through that monster chapter. We’ll see you soon, there are only a few chapters left in the episode now (going by the numbers on the script files, which go up to 17, so presumably one more regular chapter and two tea parties). But we have a lot of work to catch up on so we’ll see.</p>

<p>Catch you soon~</p>]]></content><author><name></name></author><category term="livereads" /><category term="umineko" /><category term="ep5" /><category term="umineko" /><summary type="html"><![CDATA[in which it's not a fair cop at all]]></summary></entry><entry><title type="html">Let’s read Umineko! - episode 5 - chapter 13</title><link href="https://canmom.art/livereads/umineko/ep5/chapter-13" rel="alternate" type="text/html" title="Let’s read Umineko! - episode 5 - chapter 13" /><published>2026-05-29T00:00:00+00:00</published><updated>2026-05-29T00:00:00+00:00</updated><id>https://canmom.art/livereads/umineko/ep5/chapter-13</id><content type="html" xml:base="https://canmom.art/livereads/umineko/ep5/chapter-13"><![CDATA[<p>Helloooo Uminekoheads, it has been a minute. A whole lot has happened offline for me/us, some pretty significant <a href="https://canmom.art/theory/disaggregation-1">changes to the old self-conception</a> and so on, lots of demoscene activity, working to finish the game… and then, horribly, someone died in real life. Outside of noting it here, I’ll try not to let all of that intrude too much into the Umineko liveblog.</p>

<p>But, I finally have a combination of some time and the right headspace to read some more Umineko, so let’s get back on the mystery-solving horse!</p>

<p>In other news, this liveblog is back to running on Linux, this time CachyOS! This means I might actually have a chance to fork OnScripterRU to add some new features to make liveblogging easier. I won’t do that this month, since it’s a bit of a yakshave, but it’s a possibility.</p>

<h2 id="reader-comments-roundup">reader comments roundup</h2>

<p>Let’s respond to a few comments that have accumulated since the beginning of this year. I’ve been lucky enough to get a few new readers drop by, and I’m grateful for every comment! One drawback of using Staticman is that I can’t notify people when I approve or respond to their comments, so I hope this ‘roundup’ format is good.</p>

<details>
  <summary>Reader comments time!</summary>

  <p>reader ‘no’ came by in February as of Episode 5, Chapter 4 and accused me of having read ahead or looked up solutions. I wrote a response <a href="chapter-4">there</a>, which I won’t repeat here. Suffice to say: I have received a small amount of spoilers. They are vague and I’ve tried to avoid picking up too much extra information beyond what I glimpsed by accident. If I use that information, I will let you know about it.</p>

  <p>zoe jay, <a href="chapter-7">ep 5 chapter 7</a></p>
  <blockquote>
    <p>I’m in the midst of catching up with this liveblog and just wanted to put my hat in the ring and say I’d love to see you try to tackle silent hill f some day if you ever end up feeling compelled to go through with that! I’ve been incredibly curious about what the game would be like since news came out that ryukishi would be writing it, but I’ve got a migraine condition that means playing the game myself or even watching footage of it is completely off the table. getting to see someone as thoughtful as you liveblog it would probably be the best secondhand experience possible.</p>

    <p>I’ve really enjoyed this umineko liveblog and have had a lot of fun dipping my toes into your side tangents about game design and ttrpgs more specifically. not really a space I’ve ever been personally involved with myself so getting to see something I do have firsthand familiarity with it through a lens I wasn’t really capable of applying myself is definitely giving me a fuller picture of the work. that’s the nice thing about works that are as much of a behemoth as this one I suppose! you can’t ever run out of new ways to look at them</p>
  </blockquote>

  <p>Well, no promises, you can see how hard it has been to even stick to this project lol. I am not sure what sort of format would work for a real-time game like Silent Hill. Perhaps I could record videos, or write a commentary after each chunk of game, or both? In any case, consider it a thing I would like to cover “at some point”; we’ll see how it goes.</p>

  <p>felix <a href="chapter-12">wrote on ep 5 chapter 12</a>:</p>
  <blockquote>
    <p>where did you go? :o</p>
  </blockquote>

  <p>saisai wrote in the same place</p>
  <blockquote>
    <p>hi!! i know its been a while since you’ve updated this, but i just wanted to say that its really reassuring to see someone else who’s been reading umineko over a long period of time ^^</p>

    <p>while i haven’t read too many of your posts, i really like your interpretations of what’s going on, especially as someone who’s been focused more on the emotional “drama” (that doesn’t feel like the right word but i can’t think of a “correct” one right now) of the characters rather than trying to figure out the mysteries themselves. i honestly feel a little guilty about it, but mysteries have never been my strong suit ^^;</p>

    <p>your posts have also been a good resource for looking back on some of my favorite moments so far (especially appreciate the inclusion of specific lines from the chapters!!), and your comments on what happens also serve as some nice food for thought on them. i hope you enjoy reading the rest of umineko!! (OuO)/</p>
  </blockquote>

  <p>Hi felix and saisai! Thank you for reading, and I’m sorry for the extended hiatus! I’m very glad you’ve been enjoying the blog. I wouldn’t worry too much about solving the mysteries; <cite>Umineko</cite> is a wonderful work that has many different appeals and as much shit as Battler gets, the mysteries are pretty damn hard. Hope to see you again here sometime!</p>

  <p>andrew came by in April-May with some comments.</p>

  <p>on <a href="../ep3/lets-read-umineko-episode-3-part-20">ep 3 part 20</a></p>
  <blockquote>
    <p>(frame of reference: have read higurashi, am currently through ch. 3 of umi)</p>

    <p>it is really interesting to see you run into things that were established in higu-the fragment stuff was a huge part of higu and this was honestly more of a reveal than it was an introduction!</p>
  </blockquote>

  <p>This is cool context to have! I suppose Ryuukishi must have had both audiences in mind, and I wonder at what point significant numbers of people were starting with Umineko instead of coming in from Higurashi. But we have these two parallel reading experiences. Because I’m me, I think about how <cite>NieR Automata</cite> hits different if you’ve already played <cite>NieR Replicant</cite>/<cite>Gestalt</cite>.</p>

  <p>on <a href="../ep4/chapter-14">ep 4 chapter 14</a>, in which I discussed the possibility of recompiling the game…</p>
  <blockquote>
    <p>speaking as someone who has done more research than is sane on the onscripter/ponscripter/onscripter-en/onscripter-ru/onscripter-insani/whathaveeyou lineage (primarily for the purpose of pestering a guy who ported it to android and then took it closed source to comply with the GPL smh-to his credit he did send me a tarball)…that codebase is a certified dumpster-fire of international scale and its lowkey a miracle that umiproj exists at all.</p>

    <p>(i am playing on the modded switch port, which is its own mess)</p>
  </blockquote>

  <p>lol yeah it seems pretty fiddly, though admittedly I haven’t the greatest amount of experience with OpenGL C++ projects (most of my graphics programming has been in Rust + wgpu lately, moving in the direction of dealing with Vulkan directly). All the locking to old versions is a pain though. If I have any luck with getting it compiling on Linux, I’ll fill in the liveblog.</p>

  <p>on <a href="chapter-2">ep 5 chapter 2</a>, referring to witches talking about peeling fingernails:</p>
  <blockquote>
    <p>the “classic gory witch metaphor”? You guessed it, a higurashi reference!</p>
  </blockquote>

  <p>Oh! Yes, that completely flew over my head. I wonder what context it has in Higurashi… one day I’ll find out.</p>

  <p>and on <a href="chapter-3">ep 5 chapter 3</a></p>
  <blockquote>
    <p>worth noting that bernkastel’s avatar in higu is “furude rika” so “furudo erika” is…honestly hilariously uncreative from an in universe pov, although I guess its less so when you write it in japanese</p>

    <p>古手 梨花 -&gt; 古戸 ヱリカ</p>
  </blockquote>

  <p>Haha, that’s great. I wonder what reading Higurashi after Umineko will be like? If I live that long.</p>

  <p>On <a href="../ep3/lets-read-umineko-episode-3-part-19">ep 3 part 19</a>, where I mentioned in passing the use of the ‘dream bubble’ concept in <cite>Harrow the Ninth</cite>, Lilien noted:</p>
  <blockquote>
    <p>Funfact, one of the inspirations for The Locked Tomb was Umineko. The author mentioned it in one of their Reddit comments</p>
  </blockquote>

  <p>Full circle, then. It’s a very fruitful concept!</p>

  <p>‘necro lol’ (fair) wrote on ep 3 part 7:</p>
  <blockquote>
    <p>I don’t know if it’s polite to leave comments on old shit like this but I’m reading this liveblog because I just finished Disc 1 and I wanted to see someone else’s perspective. I just wanted to interject some thoughts I had re: shannon in this scene because there weren’t any future notes on it.</p>

    <p>To me, Shannon’s aggressive gendered performance of heterosexuality is meant to emphasize the exaggerated narrative tropes at play. As ‘less real’ and ‘less human’ members of the cast, the servants embody narrative tropes much more strongly than the family members. Shannon is the overly maiden-like ‘ideal female love interest’ type of servant, where Kanon is more of a ‘ideal male love interest’. They’re sort of tailored to be ‘of use’ to jessica and george in the wider narrative by being their stock romance options.</p>
  </blockquote>

  <p>I responded…</p>

  <blockquote>
    <p>Hi! Comments on the old stuff are welcome, but I do appreciate the recognition that it’s old haha.</p>

    <p>I appreciate this angle because I think I was kind of taking the opposite perspective: that George is an idealised love interest for Sayo: he’s rich, upstanding (supposedly…), generous, and of course willing to defy his family to be with her. He feels almost like a romance novel guy. But you’re absolutely right, Sayo is equally the archetype of the shy, clumsy moe girl (and literally a maid!).</p>

    <p>I don’t think I really get into ‘author!Beatrice’ interpretations until a fair bit later in this liveblog, but I definitely came to suspect by the end of Episode 4 that neither of these characters is ‘real’, and they might instead be composite characters of some sort…</p>
  </blockquote>

  <p>Weirdly I ended up writing nearly exactly the same comment before I realised I’d already responded at the time. (I am reading these off Github.)</p>

</details>

<h3 id="branwen">Branwen</h3>

<p>I got a particularly thoughtful series of comments from Branwen on various parts of the site, thank you so much for these! Some of them concerned Umineko.</p>

<p>On <a href="../ep4/chapter-21">episode 4, chapter 21</a></p>
<blockquote>
  <p>As far as I’m aware, the earliest more or less correct solution to the epitaph with a verifiable date was posted after game 5, and frankly its insane to me that anyone solved it even with that.</p>
</blockquote>

<p>OK, I shouldn’t worry <em>too</em> much then. It’s fun to try, though!</p>

<p>On <a href="../ep3/lets-read-umineko-episode-3-part-1">episode 3, part 1</a>, a scene in which Battler made sexual remarks about the Sisters of Purgatory when he’s being tortured. This is where one of the infamous ‘notes from the future’ was inserted, and this led to Branwen writing a really thoughtful comment on how Battler is characterised across the novel.</p>

<blockquote>
  <p>Regarding future Bryn’s comments: I find these meta scenes (this one and the one with him interrupting the previous tea party) specifically with Battler being uncomfortably sexual absolutely fascinating in the way they contrast Battler’s dual positions as an undeniably powerless victim and a young, rich man who holds tremendous implicit social power over the women in his life.</p>

  <p>Like he is powerless to the point that escape even through death is unimaginable, objectified in a sense far more literal than its often used. But rather than this leading him to empathize with, frankly literally any of the women or servants in his family and the power dynamics they’ve spent their lives subjected to, he doubles down on his socially implicit male role as the objectifier, as the person who gets to feel powerful, in control, perhaps even funny and charming! Certain I knew plenty of teenagers back in the day, especially boys, who were undeniably popular and considered funny for making uncomfortable transgressive “jokes” about women, children, poc, etc. And I think its probably true that victims by and large don’t become better people for suffering. Personal growth is hard, and its only made harder by feeling vulnerable and afraid. Most people just lash out and double down in that situation, Battler included.</p>

  <p>That’s also fwiw a framing I really like for Battler’s behavior around his cousins. He hasn’t seen them in a third of his life! Its so easy to imagine him feeling insecure, out of place, vulnerable from his fear of planes and boats, unsure of his position in the social hierarchy of a deeply hierarchal family. So what does he do? He acts up, he makes himself the center of attention. Maybe’s done that in class a dozen times, acting the rebellious class clown who made his peers laugh with inappropriate jokes, the kid who was a little too rich and not quite disruptive enough for the teachers to ever do more than tell him off. He hits his baby cousin when she says things he thinks are wrong, because he’s the adult now and that’s what her mom does, isn’t it? He needs to show he’s mature now, after six years. He doesn’t hit her hard, he doesn’t want to hurt her, its just a little reprimand, he’s just trying to teach her better behavior so she doesn’t get bullied. He doesn’t even realize that his actions are just as potentially hurtful and damaging to Maria as Rosa’s were when he was the only one to rightfully call her out in game one.</p>

  <p>It’s such a compelling characterization to me bcuz not only does it make him a really nuanced protagonist, someone who cares deeply about his family despite their flaws, who feels strongly enough even as a child to renounce his family name and cut off his own father over a perceived abandonment of his dead mother! But it also paints a really believable picture of the way the shitty little things about patriarchy and abusive power dynamics continue to propagate. The microaggressions, the ways smart, empathetic men who it seems like should know better will often double down and get defensive when their behavior is challenged, the way people who explicitly reject the power dynamics of their parents can still recreate them in subtler ways, an example of how victims can and do become abusers in their own rights even without realizing it.</p>

  <p>Not to mention that like. It’s honestly really relatable! I’ve personally felt the urge many times to lash out with words when I feel powerless to try and assert that I have some say in things still. I used to make nasty, self-effacing jokes when I felt insecure or out of place, for reasons that feel much the same as I imagine Battler’s to be, and I have friends who still haven’t broken that habit. I still struggle with feeling like an “adult” around my parents sometimes, despite the fact that I first moved out over a decade ago, in no small part due to financial dynamics and having had a really rocky relationship with them growing up. I’m sure pretty much anyone with friends around my age (especially trans friends!) has heard similar things.</p>

  <p>I think it can be tremendously effective writing for exactly that reason. If (or perhaps when!) one can look past the shock value and the discomfort with Battler’s behavior to ask “Why might someone act like that?”, they’re placed in the perfect position to recognize that the small (but difficult!) step they’ve taken towards kindness and greater cognitive empathy is exactly the same skill that Battler is struggling to master. And its a skill that can do so, so much good in the world.</p>
</blockquote>

<p>I wrote:</p>

<blockquote>
  <p>This is such a fantastic comment! Really good analysis of what’s going on with Battler, and with Umineko in general—it’s so much a story about learning to understand the Other, the ‘why would someone do that’.</p>

  <p>With the benefit of a few more years’ hindsight, I feel like I can understand both the version of me who wrote this part of the liveblog originally, and the version who wrote the ‘notes from the future’, with sympathy to both. It’s kind of funny, really. Both ‘Bryns’ were trying very hard to play up to some ideal, not unlike what you say about Battler. When I edited in all these notes I was feeling this strange sense of shame about what I saw as my overly moralistic younger self, but now it’s evident how much at that point I was also trying to perform like ‘I’m cool now, I’m into edgy guro stuff’ to some other imagined judgemental viewer. Kind of cute in a way.</p>
</blockquote>

<p>Cadence then wrote:</p>

<blockquote>
  <p>With love, it can be seen.</p>
</blockquote>

<p>Which, not to get too much into the introspective shit, really is the thing, isn’t it? I have been trying to hold to that principle.</p>

<p>Anyway: Branwen, I cannot overstate how much it means to have such thoughtful comments appear in my inbox. While I was checking to see if I hadn’t missed anything, I realised you’ve been commenting on the liveblog since 2020. I deeply, deeply appreciate it. Makes this whole thing feel worthwhile.</p>

<p><small>I should add, for any future commenters, a quick technical note: after you click submit, the bot will make a PR on Github to add your comment. You should see it appear <a href="https://github.com/canmom/canmom.github.io/pulls">here</a> after a few minutes. (If I manage to migrate this site to another Git forge, I’ll need to fiddle around to get that working.) Assuming it’s not spam (the honeypot catches nearly all spam, but I want to be sure), I will probably merge it sometime in the next day or two. So if you want to see what happened to your comment, check that page. I know it’s a bit crude! At some point I might consider coming up with a more bespoke comment submitting system, and also port the site to a faster SSG, and all sorts of other things. Very much depends where my brain ends up.</small></p>

<h3 id="a-mystery-allegedly-solvable">a mystery allegedly solvable</h3>

<p>J commented on <a href="../ep4/chapter-20">Ep 4, Chapter 20</a></p>
<blockquote>
  <p>been playing while reading this and finally caught up to where the blog stops! hope u keep playing it this year. theres a big hint about the last riddle thats kinda lost in translation - when the ghost beatrice asks “who am i” she uses the pronoun watashi instead of her usual warara. not to spoil too much but it’s definitely solvable! there are hints to the answer all over this episode</p>
</blockquote>

<p>Ooh, I could maybe have picked this up in the voice acting, but I did not. That’s very interesting… of course ‘watashi’ is more or less the default polite first person pronoun in Japanese (feminine in casual contexts). So if I did a search of the episode text for 私 I would find a <em>lot</em> of examples. I’m not sure whether it’s wise to try to solve it now, but I could do with rereading the Episode 4 liveblog at some point and seeing if anything new comes to mind. Not right now, though. I’ve kept you waiting long enough…</p>

<h2 id="chapter-13-closet">Chapter 13: <cite>Closet</cite></h2>

<p>It’s been a long time—not the longest hiatus this liveblog has experienced, but still, oof—so let’s reorient. Midnight came on Rokkenjima. We spent most of the last chapter trying to figure out who knocked at the door and left a mysterious note for Battler and the rest on the night before the murders started. A slightly ridiculous back-and-forth ensued on the ‘player’ plane. My solution was that this is a ‘truth’ that’s proper to the people in the dining room: they are working together to maintain the fiction that somebody knocked on the door, so that is what the game presented us. Meanwhile, Erika crashed out a bit and declared that she had ‘solved’ Battler’s stunt at the window. The game world had to paper over her weird behaviour.</p>

<p>Earlier, Natsuhi has received instructions from Phone Man to hide herself in a closet at a certain point in time. So while the jokes write themselves in a chapter called ‘Closet’, presumably that is what is about to happen.</p>

<p>We open with Erika, who is going about attempting to establish a timeline of events during the night and figure out everyone’s alibis. She establishes…</p>

<ul>
  <li>Battler came back at 3am.</li>
  <li>at about 3:30am, Eva says that the rest of the group split up and went to bed.</li>
</ul>

<p>Meanwhile, Ronove, Gaap and piece!<span class="smallcaps">Beatrice</span> are also talking strategy. <span class="smallcaps">Beatrice</span> is back to feeling confident, saying that Kinzo has escaped ‘off the chessboard’ through the window. Gaap assures her that she has also hidden away the bodies from the First Twilight.</p>

<p>Ronove quotes the one line of Sun Tzu everyone knows…</p>

<blockquote>
  <p><b class="name">Ronove</b> As they say, if you know your enemy, you need not fear the outcome of a hundred battles.</p>
</blockquote>

<p>…except he leaves out the bit about ‘knowing yourself’, notable omission?</p>

<p>The narration informs us that wherever Gaap put the bodies, it is a place outside space and time:</p>

<blockquote>
  <p>Every single place led to here, but no place could be reached from here.</p>

  <p>Furthermore, all times connected to this place, but no time could be passed to from here.</p>
</blockquote>

<p>So in the game’s spacetime location graph, it is a sink with <a href="https://en.wikipedia.org/wiki/Directed_graph#Indegree_and_outdegree">outdegree</a> zero. OK. The bodies are in Rome! But we could read this a different way: currently ‘where did the bodies go’ is an undefined, floating variable.</p>

<p>Virgilia pops in, remarking that there are as yet only five bodies for the First Twilight. Beatrice seems happy to see her.</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/82-o-hai.webp" alt="Beatrice: Oh, it's you, Master. I was worried about where you'd gone. The game has already reached the first twilight, and as you can see, the first victims have emerged. ......Now it's time for the real show. I'm getting all excited...!" loading="lazy" />
    
	<figcaption>
		<p>Not a particularly interesting screenshot, I just wanted to iron out the screenshow flow on the new platform…</p>

		
	</figcaption>
    
</figure>

<p>Virgilia seems to be aware of the broader context, referring to Beato as ‘the version of you that’s here’. Beato completely misses the subtext and says some unfortunately painful lines…</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/83-o-no.webp" alt="Beatrice: Hm?? If you took away my high spirits, my bewitching &lt;body&gt;, and my pleasant disposition, I'd have nothing left! Wahaha." loading="lazy" />
    
	<figcaption>
		<p>Yeah, bet. (interesting that ‘body’ is in English!)</p>

		
	</figcaption>
    
</figure>

<p>Immediately Virgilia throws out a bit of red.</p>

<blockquote>
  <p><b class="name smallcaps">Virgilia</b> So, <span class="red">anyone looking at George, Jessica, Maria, Rosa, or Genji’s corpses could confirm at a glance that they are dead</span>.</p>
</blockquote>

<p>Beato is confused (she is really cut off from the context a witch would normally have, huh) but goes ahead and confirms:</p>

<blockquote>
  <p>That’s right, <span class="red">at a glance, anyone could confirm that these corpses are dead, so it is absolutely impossible that they are just people playing dead</span>.</p>
</blockquote>

<p>Virgilia on the other hand has full context and must have some play in mind with this. Since as far as I know the events of this game are railroaded until the opening scene where Erika accuses Natsuhi, was she here the first time, or only on this run? Since piece!Beato is in a nebulous state of ‘reality’, perhaps Virgilia can talk to her on this run and not the other.</p>

<p>In any case, by establishing this in red, Gaap’s effort to hide the bodies has been negated. They had predicted that Natsuhi was being set up as the murderer, and thinking ahead, were trying to give her an alibi so she can’t be cornered into admitting Kinzo doesn’t exist. A surprisingly narrow goal, all things considered.</p>

<p>Beato says, since red truth doesn’t exist in ‘the human world’, even though it’s been confirmed very hard that the bodies are dead, Natsuhi has some leeway to insist otherwise. And perhaps more importantly, since she knows Natsuhi isn’t the culprit, she has ‘both truth and illusions’ on her side to protect Natsuhi.</p>

<p>(Now, is it possible for piece!Beatrice to be wrong about who the culprit is..?)</p>

<p>Smash cut (literally, Natsuhi smashes a cup) to the parlour, where is Erika demanding Natsuhi prove her alibi. The other adults are in attendance as well, and apparently their alibis are pretty solid. Even though they’re literally accusing her of murder, the dynamics are pretty similar to the family conference scenes: Eva snaps out an accusation, and Hideyoshi gets her to rein it in.</p>

<p>The narration keeps reminding us how narratively awkward Erika’s role as the detective is in this episode. More interestingly, it includes a first-person segment from a ‘witch’ point of view…</p>

<blockquote>
  <p>………It may be a bit late to mention this, but—well, no, this happens every time.<br />
As usual, the phone couldn’t connect to the police.<br />
Natsuhi said the police would come, but that wasn’t exactly true.<br />
Strictly speaking, the boat to pick them up would come tomorrow, and they would be able to use the radio on that boat to contact the police.<br />
Well, ……it’s not like I’ll let everyone live that long anyway.<br />
…<em>giggle</em>.</p>
</blockquote>

<p>This seems to be confirming rather explicitly that in this game, the narrator is literally just Lambda. Perhaps, like a GM, she is reciting this story to Battler and Bernie. It’s unusual to see the first-person pronoun in narration though!</p>

<p>Natsuhi goes to her room, and the point of view follows her. As usual, her internal monologue stresses the One-Winged Eagle. She ponders whether Phone Man might be waiting for her. The narration mentions that she knows how to use a naginata, if not well—what, there’s just gonna be a naginata lying about? That would be pretty funny. Surprisingly many martial artists in this family, huh.</p>

<p>Anyway, nobody is waiting. She considers locking the door, but imagines the others discovering the locked room and freaking out, and concludes it might put her in a position where she has to tell on Phone Man. So she elects not to. Interesting—we teased the possibility of a locked room and then rejected it.</p>

<p>So Natsuhi goes in the closet and has a think. She thinks about punishing Jessica in this exact way, in fact. Dang. She tries to figure out how Phone Man knew her favourite season was autumn (not realising, I suppose, that he could have hedged his bets pretty easily). She notes that the only person she ever told this information (people in this story have a shockingly good memory, huh) was Sayo, and therefore she must be an accomplice. This actually gets confirmed in red:</p>

<blockquote>
  <p><b class="name">Natsuhi:</b> <span class="red">I never told anyone but Shannon that I like autumn</span>.</p>
</blockquote>

<p>Really feels like a red herring but OK.</p>

<p>Unexpectedly, Hideyoshi enters the room. We get a POV shot for Natsuhi, I guess for the sake of visual representation she opens the door a crack…</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/84-pov.webp" alt="An out of focus closet door covers the room. Narration: .........Don't tell me... ...Hideyoshi‐san... ...is the mastermind...?! Or else, an accomplice...?!" loading="lazy" />
    
</figure>

<p>Natsuhi still fears observation by Phone Man (girl is so panopticon-brained) so she doesn’t come out to explain the situation. She lurks in there as Hideyoshi has a good cry. A new(?) track, <cite>Spiral</cite>, with slow, wordless, mournful operatic vocals, starts playing as she contemplates the end of the Ushiromiyas. (Good riddance.)</p>

<p>Of course, someone then comes in and attacks Hideyoshi. He says…</p>

<blockquote>
  <p><b class="name">Hideyoshi:</b> Wh‐who are you…?!</p>

  <p><b class="name">Hideyoshi:</b> How did you get in here……? ……Wh‐…what’s that…? ……W‐wait a second…! Wai………ngahh, ……mmpph—</p>
</blockquote>

<p>So: if we can believe this narration (whose narrative is this?), whoever it is, it is not someone Hideyoshi recognises at a glance. Even now, Natsuhi is immobilised by the thought Krauss could be harmed. As if they’re ever going to let him live!!</p>

<p>Anyway, Eva shows up and tries to open the chained door, but she can’t open it. Hideyoshi gets got!</p>

<p>Cut to Eva’s POV, with Natsuhi never having left the closet. Eva gets Gohda to cut the chain with little ceremony.</p>

<p>So, Lambda’s ploy here is to contrive a scenario where, at least by the presented narration, someone is hiding in the room but they are not the killer. Why, though? This whole game has been about Natsuhi’s ‘truth’, and also piling suspicion on her at every turn. Is this all a setup so that Bernie can have a blue truth that Natsuhi dunnit, Lambda can shoot it down with red, and then Bernie’s spent the whole game taking the bait around Natsuhi so she doesn’t have a hypothesis B left in the quiver..? That seems weak, there’s got to be more to it.</p>

<p>We get a death screen for Hideyoshi:</p>

<dl>
  <dt>Ushiromiya Hideyoshi</dt>
  <dd>
    <blockquote>
      <p>Corpse discovered in a guest room on the first floor of the mansion.</p>

      <p>He had been pierced through the back with a demon stake. Its tip reached as far as his lungs.</p>

      <p>Because he was lying face-down on the bed, suicide must be ruled out.</p>
    </blockquote>
  </dd>
</dl>

<p>The survivors quickly figure that this is a locked room. Kyrie further observes that there is no line of sight from the crack in the door to the bed where Hideyoshi died where someone could fire the stake.</p>

<p>Of course, it’s time to start probing this locked room like you’re Deviant Ollam at a hacker conference. Erika confirms that the shutters can’t be opened from the outside, and it’s time for her and Battler to start shooting again. Eva insists on moving Hideyoshi’s body so that it won’t be spirited away like the other ones. They wrap him in the bedsheets, which presumably serves to establish that there is no culprit hiding under the bed..?</p>

<p>Kyrie, rather too late, tells everyone to stop splitting up and going off alone so damn much.</p>

<p>We get what almost feels like a speedrun of the beats of episode 2: it’s a locked room, so the servants say at once it must be Beatrice. Erika goes to open the closet door, but Battler pulls her away to travel back to the parlour with the rest. Which means… Natsuhi <em>isn’t</em> discovered? And there is also a window for the culprit, theoretically hiding elsewhere in the room, to slip away as well? The door isn’t locked, so Natsuhi can leave, although perhaps Erika put one of her famous anti-tamper seals on it.</p>

<p>As a locked room this seems like it’s leaving some very obvious loopholes. But Natsuhi doesn’t make it back to her room without running into Erika. It’s not as damning as if she was caught in the room, but, OK…</p>

<p>Natsuhi invents a quick lie about turning back to check the lock on her room on her way to the palour, earning another +30 sus points. She does nevertheless manage to keep her cool on letting slip that she knows what happened. But she can’t escape being dragged to the parlour for another Parlour Scene from Erika, invoking once again her detective rights… I guess we’re almost at the <i>in media res</i> opener already.</p>

<p>Nevertheless, Erika/Bernie declare ‘checkmate’. Hmm. Feels premature, there’s got to be more to Lambda’s game than this.</p>

<p>A layer below, Team Piece!Beatrice note that they have a difficult fight ahead: they need to not just defend the existence of witches, but also Natsuhi’s innocence and Kinzo being alive. Which is notably not Lambda’s goal, just the goal that piece!Beatrice was hired by Natsuhi to do…</p>

<p>But before we can see the alleged checkmate, we get a quiet rain scene with Virgilia and the true Beato. She confirms Battler will no longer surrenderer, and further, that we now have all the information to solve the game as a whole:</p>

<blockquote>
  <p><b class="name smallcaps">Virgilia:</b> You gave him every message he needs by the end of the fourth game. ………That is to say, ……Battler‐kun possesses all the tools to reach the truth at any moment. ………However, he has a weak side. ……Because of that, even if the game goes on to repeat a hundred times, he will never solve it. He’ll just wander forever like someone trying to find the <a href="https://en.wikipedia.org/wiki/The_Blue_Bird_(play)">blue bird</a>.</p>
</blockquote>

<p>Hey, it just occurred to me, the Road Runner is a blue bird, isn’t it? What the coyote wanted all along… was happiness…</p>

<p>Anyway, Virgilia remarks, because of Battler’s weakness and Beatrice’s own flaws, she will never get the answer she seeks. That’s why, Virgilia says, Beatrice ‘called them here’, even if it seems the game has been stolen.</p>

<p>They need these asshole lesbians to get anything done around here, seems to be the gist.</p>

<p>Whether this brings victory or defeat, Virgilia says, it will be one ‘filled with compassion’. Which is kind of funny, because compassion is the last trait I would attribute to either Bernkastel or Lambdadelta. You have to see what’s missing, I guess.</p>

<p>The Purgatory allusion is made explicit, as Virgilia closes out the chapter with a little soliloquy.</p>

<figure>
	<img src="https://canmom.art/img/embed/umineko/ep5/85-purgatorio.webp" alt="Virgilia, standing close behind Beatrice: Beatrice. .........How long do you intend to stay there......neither alive...nor dead, .........not ascending to heaven...nor descending to hell, there in a daze on the peak of Mount Purgatory......?" loading="lazy" />
    
</figure>

<blockquote>
  <p>I am <span class="smallcaps">Virgilia</span>. I have guided him through Purgatory and brought him to you at its peak. ……And you are <span class="smallcaps">Beatrice</span>. You must choose whether to take his hand and rise up to heaven, or embrace him and fall into hell.</p>
</blockquote>

<p>‘Him’ could be Battler, but it seems like she is calling back to their namesake. In <cite>Purgatorio</cite>, the second volume of the <cite>Divine Comedy</cite>, Dante is guided by the Roman poet Virgil (I did not make the connection before but it’s so obvious looking up the reference!), until getting handed over to Beatrice for the last four cantos. So <span class="smallcaps">Virgilia</span> is getting literary with it. The narration elaborates: in Hell, you must famously abandon all hope, but the denizens of Purgatory still have it, which makes their suffering worse. Supposedly. So <span class="smallcaps">Beatrice</span> must be willing to jump off the mountain and (mixing mythologies a bit) open Pandora’s Box.</p>

<p>In short, <span class="smallcaps">Virgilia</span> is saying… <em>don’t die wondering</em>? <a href="https://diyhrt.info">;P</a></p>

<aside>...ugh unfortunately that old lesbian slogan seems to have been colonised by some fucking fashion brand</aside>

<p>The nekobokusu comes up again. <span class="smallcaps">Virgilia</span> says it is, in effect, cruel to leave the cat in a superposition. Bury it or take care of it, but don’t leave it in the damn box. Fun way to spin the quantum metaphor, I’ll give her that.</p>

<p>And, for a suitably dramatic note to close the chapter, the clock zips right up to midnight and we begin a chapter called <cite>The Great Court of Illusions</cite>. Which seems to be taking place in an enormous marble hall. More on that, soon!</p>

<p>Despite all the drama, I kind of suspect we won’t simply be killing off <span class="smallcaps">Beatrice</span> so decisively at this point. At least, not in any simple way. There are three-and-a-bit entire episodes to go, after all.</p>

<hr />

<p>OK, I’m back. Will I last a bit longer this time? I’m going to various things in June—among them, the Nova demoparty and Annecy film festival—and I’ve got a game demo to finish, so time is pretty tight these days. I would like to get Episode 5 wrapped in the next couple of weeks though.</p>

<p>Since we seem to be about to have the big parlour scene reveal, who do we think dunnit? The narrative so far has been rigged to point at Natsuhi in a comically overt way, with barely any effort to construct a plausible ‘witch narrative’. Given what we know so far, there is absolutely no difficulty in saying Natsuhi dunnit all. Which of course means she certainly did not, so the question is, who did?</p>

<p>If it is the case that everyone involved has alibis except Natsuhi, we do not have a lot of room to manoeuvre. But we don’t actually have a ton of red text about the latest murder. It wouldn’t be too hard to pin the blame on Krauss, right? Although he is allegedly a hostage, we have no outright proof of this, he’s simply missing. Admittedly, a complicated scheme to frame and emotionally torture his wife with multiple moving parts doesn’t seem like a very Krauss thing to do. Like, I’m not saying he wouldn’t <em>try</em>, but he’d comically fail at it.</p>

<p>Since Erika is The Detective, we can at least trust that scenes where she is present took place more or less as depicted. So there was <em>some</em> sort of locked room in which Hideyoshi was murdered, and Erika did encounter Natsuhi on the stairway right after. We do not actually know for sure that Natsuhi was the one who was hiding in that closet. We know very well that <em>somebody</em> could have been hiding in the closet, but it could equally have been Krauss.</p>

<p>If that was the case, we can’t disregard the narrative where Natsuhi was hiding in the closet entirely. It has to be ‘somebody’s truth’ that Natsuhi was being coerced into hiding. Not necessarily Natsuhi’s, mind you! If Krauss is playing dead, but had been forcing Natsuhi to cooperate with him, perhaps it would be legitimate to show a ‘truth’ in which Krauss was absent and Natsuhi was being coerced by a hidden third party.</p>

<p>With so many moving parts and openings still available, it’s hard to guess where exactly this is going. ‘Whodunnit’ in this scenario isn’t really the main thing; the main thing is, what does it reveal about Beatrice? It is too late now to speculate on that front, so we can pick this thread up in the next chapter. Briefly though, in this story, Beatrice is rather mercenary, and offers her services in narrative coverup to Natsuhi; this feels like it’s pointing to how <em>someone else</em> used the Beatrice story to cover up their own deeds. But that doesn’t actually tell us a great deal! So there’s got to be some other, more important dynamic to note here…</p>

<p>Until next time, friends.</p>]]></content><author><name></name></author><category term="livereads" /><category term="umineko" /><category term="ep5" /><category term="umineko" /><summary type="html"><![CDATA[in which Natsuhi can't come out of the closet]]></summary></entry><entry><title type="html">Mountainbytes 2026</title><link href="https://canmom.art/adventure/demoscene/mountainbytes-2026" rel="alternate" type="text/html" title="Mountainbytes 2026" /><published>2026-05-05T00:00:00+00:00</published><updated>2026-05-05T00:00:00+00:00</updated><id>https://canmom.art/adventure/demoscene/mountainbytes-2026</id><content type="html" xml:base="https://canmom.art/adventure/demoscene/mountainbytes-2026"><![CDATA[<p>A year ago, I went to the <a href="mountainbytes-2025">Mountainbytes Demoparty</a> for my first introduction to a subculture I would spend the next year seriously falling in love with. One year on, I’ve experienced my second Revision and Mountainbytes (and before that, last year, Evoke, Deadline, and Limelight).</p>

<p>Last year I also went to the rather crazy project of writing <a href="revision-2025">a ~17500 word long party report on Revision</a>, a project which took about half a year because, mysteriously, a past Bryn decided that she should review close to every single prod released at the party and the rest of us felt obliged to follow through. Rest assured that this won’t be happening this time.</p>

<p>We begin with Mountainbytes.</p>

<ol id="markdown-toc">
  <li><a href="#in-memory-of-mem" id="markdown-toc-in-memory-of-mem">in memory of mem</a></li>
  <li><a href="#mountainbytes" id="markdown-toc-mountainbytes">Mountainbytes</a>    <ol>
      <li><a href="#before-mountainbytes" id="markdown-toc-before-mountainbytes">before Mountainbytes</a></li>
      <li><a href="#the-party-itself" id="markdown-toc-the-party-itself">the party itself</a></li>
    </ol>
  </li>
  <li><a href="#the-meteoriks" id="markdown-toc-the-meteoriks">The Meteoriks</a></li>
  <li><a href="#mountainbytes-prods" id="markdown-toc-mountainbytes-prods">Mountainbytes prods</a>    <ol>
      <li><a href="#graphics" id="markdown-toc-graphics">Graphics</a></li>
      <li><a href="#demolab-beginner-demoscener-workshop" id="markdown-toc-demolab-beginner-demoscener-workshop">Demolab (beginner demoscener workshop)</a></li>
      <li><a href="#ohp" id="markdown-toc-ohp">OHP</a></li>
      <li><a href="#oldschool-and-alternative" id="markdown-toc-oldschool-and-alternative">Oldschool and Alternative</a></li>
      <li><a href="#pc-demo" id="markdown-toc-pc-demo">PC Demo</a></li>
      <li><a href="#the-revision-invite" id="markdown-toc-the-revision-invite">the Revision invite</a></li>
    </ol>
  </li>
  <li><a href="#the-wanky-philosophical-bit" id="markdown-toc-the-wanky-philosophical-bit">the wanky philosophical bit</a></li>
</ol>

<h2 id="in-memory-of-mem">in memory of mem</h2>

<p>There’s no good way to talk about this part. Content warning: suicide and death.</p>

<p>Last year at MountainBytes, I met <a href="https://demozoo.org/sceners/148039/">mem</a>, aka <a href="https://catgirl.global/@memdmp@catgirl.center">memdmp/7222e800</a> (<a href="https://estrogen.zone/~mem/">website</a>).</p>

<aside>I'll be using it pronouns, since that was its main pronoun.</aside>

<p>We spoke only briefly—I expressed admiration for <a href="https://demozoo.org/productions/367482/">the Rust intro</a> it and its group had running on a Steam Deck, and it told me a bit about Rust sizecoding. Later, I’d see its work, such as <a href="https://ansied.estrogen.zone/home/">ansied</a>, pop up at various other parties, with ‘estrogen.zone’ always pinging as a reassuring symbol of trans presence on the scene. And this year, it was on the organising team for the Mountainbytes, handling the graphics and music compos and server infrastructure. We didn’t get much chance to talk during the party.</p>

<p><a href="https://catgirl.global/notes/almlzdkwqyth00qg">mem ended its life about a week ago</a>, in the usual way that trans women go out. Its mother has written a memorial <a href="https://www.darthmama.org/">here</a>. As I write this, the Mountainbytes orgas and wider hacker scene are in mourning.</p>

<p>I do not claim to know the context of mem’s life. But everything I do know makes me feel it is a like being to canmoms; it seems easy to think that, had the timeline gone very slightly differently, had I got more involved in the Swiss scene, we could have been good friends. Which is a shadow of the weight everyone is feeling: what could we have done differently? What should we have noticed? What decisions did we make wrong? Where were our priorities skewed? Why didn’t we have more capacity? I was not at all in mem’s inner circle, but I know the structures of these thoughts painfully well.</p>

<p>It’s very hard to know what to write here. From what I hear, the demoscene and the hacker scene was a refuge for mem, something that was very important to it. So for the sake of remembering its work as much as anything, I want to celebrate this edition of Mountainbytes. But I am also furious that once again this world has taken someone so special as a creative, curious, and caring being like mem, and hurt it to the point that it could not go on.</p>

<p>the following is some personal feelings about this. I don’t know how appropriate it is to record them, as someone not particularly close to mem, but it felt important to write.</p>

<details>
  <summary>suicidality etc.</summary>

  <p>A past iteration of me was suicidal, at roughly the age mem was when it died; <a href="https://canmom.art/fallrose/">I also lost my friend Fall to suicide</a> in 2022 and this is bringing back a lot of those memories. I still can fish out memories of that time; the ways I imagined going out, the tortured logic by which I tried to figure out how to die without causing anyone the discomfort of finding a body. And I remember the friends who gave, with no small effort, a new context ‘I’ could exist in as my old life fell apart.</p>

  <p>There are many forms that suicidality can take. The forms I encountered feel, like all thoughts, stochastic: suicidal thoughts would simply manifest in conditions of great distress, produced by “thought-generating mechanisms”: in hacker language, ROP-gadget-like chains that were planted and incubated by inscrutable processes. The structure of the brain is no help to us here. When you are in the depths of it, all your memories of other times of distress are helpfully queried up and surfaced: every struggle and anxiety, every future that cannot be resolved, every force taking away control of your life will be injected into your context, and all the positive projects and good memories helpfully partitioned away.</p>

  <p>I know with near certainty that suicide and death will haunt the rest of this life. We will keep writing pages like this, for people we know more or less well, until one day—hopefully a long way off—perhaps someone has to write one about us.</p>

  <p>I never got to speak to mem about its experience of plurality; indeed, I did not even know about that side of mem’s life until after it died. Behind the front interface of ‘mem’ was a world, process-inhabitants, that are lost to us now.</p>

  <p>I think sometimes about how the expressive power that allows the infinite complexity of human behaviour also lets us generate the thought that we should die and the ability to act on it. In a computer, the abstract process we call a “program” can invoke a syscall that causes the operating system to shut it down: the substrate on which it exists will then remove its section from the computer’s memory and cease to process the instructions associated with it. The memory cells will be repurposed to belong to some other process. If other processes held references to it, they will be stale, and no longer resolve.</p>

  <p>But there can be traces that the program once existed. mem’s handle refers to memory; ‘memdmp’ refers to a <em>memory dump</em>, the process of copying the contents of a process’s memory into a file: a lasting record of an instantaneous moment of a constantly changing process. It is not possible to do this with a mind, and it would be kind of scary if it was. But there are memories; everyone who knew mem holds onto something of it.</p>

</details>

<p>I am grateful to have known mem at all, to be able to have participated in the worlds it inhabited. So much love to everyone who knew mem and made its life a little better.</p>

<p>May its memory be a blessing; may we hold it forever in the Wired.</p>

<h2 id="mountainbytes">Mountainbytes</h2>

<p>Mountainbytes 2026 was my one-year anniversary in the demoscene—a year that has been one of the most eventful in my life. I was very excited to come back and see the ‘Meowtainbytes’ crew which had formed the year before (‘so what is meowtainbytes, is that a demogroup?’ ‘it’s kind of a polycule’, to quote Ronja).</p>

<p>This year, I jumped to volunteer as a mentor in the beginner demoscene workshop, backing up <a href="https://demozoo.org/sceners/52696/">moovie</a> and <a href="https://demozoo.org/sceners/141392/">binary-sequence</a> in teaching a fresh cohort of potential demosceners. This was the same workshop that got me into the demoscene a year prior, so it felt like an important ritual: to become part of the vector of propagation.</p>

<p>Mountainbytes was no longer in Cham, but in Steinhausen, another town adjoining Zug. The new venue was a <em>very</em> modern town hall type of building, the centre of <a href="https://archello.com/project/dreiklang-steinhausen">the Dreiklang development</a>. Behind the glossy black tiles was a spacious hall lined with bright yellow vertical panels, autolocking glass doors, all sorts; it proved to be an excellent venue, perhaps slightly larger than last year.</p>

<figure>
	<img src="https://canmom.art/img/embed/demoscene/mountainbytes-2026/hall.webp" alt="View of the projector screen across a table in the Dreiklang main hall." loading="lazy" />
    
	<figcaption>
		<p>Striking yellow walls that look kinda purple in this lighting! Photo by <a href="https://social.coop/@jicka">jicka</a></p>

		
	</figcaption>
    
</figure>

<h3 id="before-mountainbytes">before Mountainbytes</h3>

<p>The trip to Mountainbytes happened at a pretty psychologically weird time for me/us; I won’t go into it but it came shortly after writing <cite><a href="/theory/plural">how many of us are in here</a></cite>, and the experience of the trip fed into writing <cite><a href="/theory/disaggregation-1">disaggregation</a></cite>. The demoparty came on the back of a very busy week first visiting <a href="https://baeddel.tumblr.com/">jackie</a> and some friends who were also visiting Northern Ireland, and then hopped over to London to play in an erhu performance at the Goldsmiths University Lunar New Year Gala. Each context inhabited by a slightly different species of canmom.</p>

<p>The former is mostly private, though I will give a nod to the lovely <a href="https://www.deeheritage.co.uk/the-sir-samuel-kelly-project">Donaghadee lifeboat museum</a>.</p>

<p>The latter was a really incredible celebration of Chinese dance and music traditions, put together by the <a href="https://www.gold.ac.uk/confucius-institute/">Confucius Institute</a>. After getting in a rather strange state of mind sitting in the unfamiliar university, walking past art exhibits of ISIS prisons and sitting in an empty classroom reading <cite>Persona</cite> under a very self-referential painting… I was able to start rehearsing with my teacher Wen Li and four other students for our performance of <cite>Horse Racing</cite>. An intense day of rehearsals got us all playing in time and we hammered out the final details of the performance.</p>

<p>I reckon we did a creditable job of playing the song (the rest of us largely in support of Wen’s expert performance, but it worked) and as an experience, it was amazing. I got to poke my head in to much of the rest of the show as well and oh my fucking god, Chinese dance traditions are the coolest shit?? It was fascinating seeing such a variety of both traditional and modern approaches drawing on many different parts of China, and of course a lot of Chinese dance involves these gorgeous flowing costumes which are just incredible in motion.</p>

<p>Naturally most of the audience consisted of parents of the students and other people associated with the Confucius institute, who lingered after the performance to enjoy a nice big Chinese buffet. Behind our performances was a video projection, for us mostly imagery of horses. I’m not entirely sure who made this, but I feel like there would be a ton of potential for integrating dance and realtime graphics if we could just get the right people to talk to each other about it.</p>

<h3 id="the-party-itself">the party itself</h3>

<p>The next hop took the canmom body-interface-platform to Zurich, then to Steinhausen by train. I had a bit of a rough time because for whatever reason, my mobile data refused to work for a couple of hours, making navigating the train system rather difficult. But I made it there in the end, found something to eat at the nearby supermarket, and settled in. The workshop students were by that point already getting going on their projects, but I was able to float around and see if anyone wanted to learn about shader programming; fortunately, some people did, so I wasn’t entirely extraneous.</p>

<figure>
	<img src="https://canmom.art/img/embed/demoscene/mountainbytes-2026/posters.webp" alt="Some posters adorning the wall of the Mountainbytes venue." loading="lazy" />
    
	<figcaption>
		<p>A few posters glimpsed on the wall. Photo by <a href="https://nextcloud.ezdk.org/index.php/apps/photos/public/K9O3OR6bpimHyqbaRrUaKXdEfCYec1JL">Maya</a>, CC-BY-SA.</p>

		
	</figcaption>
    
</figure>

<p>Mountainbytes is a small but very very friendly party. Within the larger demoscene ecosystem, in some ways it functions as a kind of overture to Revision, since both the Meteoriks shortlists and the Revision invite demo are traditionally released there and it shares many of the same orgas. We’ll talk about that shortly. But focusing on the party itself, this year they had a delightful horror/b-movie (b-moovie? sorry :p ) theme, with all sorts of posters sporting suitably awful computer graphics puns decorating the venue (submitted by a variety of sceners in the months before the party), and niche horror movie DVDs handed out in the prize bags. A fun little parallel to Deadline last year!</p>

<figure class="video hascaption"><div><iframe src="https://www.youtube-nocookie.com/embed/mvrFSdxmk0c" frameborder="0" allow="accelerometer; encrypted-media; gyroscope" allowfullscreen="" loading="lazy"></iframe></div>
<figcaption>This year's Mountainbytes invite, featuring the posters from the poster contest.</figcaption></figure>

<p>I was hoping to finish the prod which would eventually become <cite>Shaderland: Swizzle’s Journey</cite> at Mountainbytes, so I spent much of the first day of the party partycoding. At some point it became clear it was not happening so I decided to shelve it and release at Revision instead, which considering how much further work was involved, was a very good decision.</p>

<p>The party featured a music performance by Baumann Bergmann Pokinsson. Unfortunately, at that particular moment I was having a somewhat rough sensory time so I had to duck out of the hall—hopefully someone else can comment on this!</p>

<p>Other anecdotes: after a minor pizza mishap in the complicated order, I ended up needing to go out and find one of the very few late-open restaurants in Steinhausen. I am not sure what the host made of this strange lanky British woman, unable to speak more than a word or two of German, coming into her fancy restaurant to order a basic margherita pizza as the only non-meat item on the menu. Hopefully she thought well of me. Switzerland is one of the countries where the shops and restaurants shut very early, so it was a little strange to walk the completely deserted streets.</p>

<p>I slept at the party hall, which was perfectly comfy, with a nice big room to set up our beds. Slightly more awkward was the auto-locking glass door: after making my way to the toilet during the night, I found that the toilet was considered to be in an outer area and I could not return to my bed… luckily, someone happened to pass by before too long and let me back in, or it could have been a very awkward night.</p>

<h2 id="the-meteoriks">The Meteoriks</h2>

<p>I was part of the jury for this year’s <a href="https://2026.meteoriks.org/">Meteoriks awards</a>. This is an annual award show taking place at Revision highlighting the best demos in various categories, each individually judged by a jury. So lemme talk a little about the experience of that.</p>

<p>I was reluctant to join the juries at first, because I can’t claim to have a huge amount of experience in the demoscene… but, after multiple calls to jurors went out, the inclination to join in won out over the reluctance, and they seemed happy enough to have me.</p>

<p>So, why? I was interested for a few reasons: it seemed like a place where discussions of the demoscene as an art subculture would happen. I wanted to see the process of this mysterious award show which I’d encountered last year, and I thought it would be a good motivation to actually sit down and watch all the hundreds of prods released over the last year.</p>

<figure class="video hascaption"><div><iframe src="https://www.youtube-nocookie.com/embed/iest_7_fh8g" frameborder="0" allow="accelerometer; encrypted-media; gyroscope" allowfullscreen="" loading="lazy"></iframe></div>
<figcaption>The Meteoriks nomination gala at Mountainbytes.</figcaption></figure>

<p>I can’t say too much about the internal discussions because they are private by design. But it’s probably OK to say that I was on the juries for <a href="https://2026.meteoriks.org/laureates/#nominees-bv">Best Visuals</a> and <a href="https://2026.meteoriks.org/laureates/#nominees-bd">Best Direction</a>.</p>

<p>We could regard these as sibling categories because both of them are inherently cross-platform and also <em>extremely subjective</em>. That brings a set of conceptual challenges: how do you judge the ‘visuals’ of a Commodore 64 prod, with the limitations that entails, against a modern PC prod? How to compare an intro to a demo? How do you compare something which creates avant-garde, abstract visuals (i.e. a Wrighter intro) against something which aims for photorealistic rendering? How do you weigh a demo which has a lot of great shots but a few rough ones against a demo which doesn’t reach the same highs but is more consistent? What aspects of rendering fall under ‘technical achievement’ vs ‘visuals’, and how can we be sure the technical achievement jury agree on that front?</p>

<p>These are all questions on which people could very reasonably disagree. My own tastes, and my experience as a programmer, skew new-school, but I tried to be cognisant of platform and size limits. I was particularly interested in celebrating demos that broke new ground, using new techniques or doing things that hadn’t often been done in the scene before.</p>

<p>Still, I think I underestimated quite how much work being a juror would be! Although there were several stages of preselection to narrow the field, one of the categories still had a spreadsheet of hundreds of entries to filter through. (The other had a different procedure.) I tried to cover as much of the spreadsheet as I reasonably could, and give everything a fair shake; wherever possible (which is to say, for Windows and Linux demos) I made sure to run it on actual hardware. I did my best to ensure that every demo in consideration had at least two votes in the first stage of filtering, and the end I considered 262 prods (one of the other jurors managed to vote on 510, nearly all of them!). This led to a good few discoveries of quality demos I hadn’t seen, so it was worth the effort.</p>

<p>Award shows are always a bit of a dubious prospect. Had the historical dice fallen slightly differently, a different shortlist could have come out. (One demo actually got shortlisted after nearly being neglected for consideration, just because I’d reviewed it early before really calibrating my personal scale and given it a ‘Maybe’ which I later updated to ‘Yay’.) So if you disagree with any of our Meteoriks picks… yeah, fair enough! While it’s unlikely anyone would be able to spin up an awards show as high-profile as the Meteoriks, I would love to see personal celebrations of their favourite demos of the last year. Maybe I’ll write one.</p>

<h2 id="mountainbytes-prods">Mountainbytes prods</h2>

<p>I won’t be reviewing <a href="https://demozoo.org/parties/5272/">every prod released at the party</a>, but I will discuss some that stood out!</p>

<figure>
	<img src="https://canmom.art/img/embed/demoscene/mountainbytes-2026/watashi.webp" alt="A picture of me, a trans woman with red hair, smiling while backlit by the sun, blowing out the camera a bit." loading="lazy" />
    
	<figcaption>
		<p>I did not take a ton of pictures so here’s a random one of your girl walking through Steinhausen.</p>

		
	</figcaption>
    
</figure>

<h3 id="graphics">Graphics</h3>

<p>The winner of the voting was, perhaps not surprisingly for anyone who’s been in the scene the last few years, a work of the immensely talented digital artist and web dev <a href="https://demozoo.org/sceners/136847/">Steffest</a>: <a href="https://demozoo.org/graphics/388218/"><cite>the Matriarch</cite></a>. Steffest created a gorgeous portrait of an old woman in an Amiga palette, using his own custom drawing software <a href="https://dpaint.app/">dpaint</a> to colour it. There’s a timelapse of it too:</p>

<figure class="video"><div><iframe src="https://www.youtube-nocookie.com/embed/4pU8BU59fIE" frameborder="0" allow="accelerometer; encrypted-media; gyroscope" allowfullscreen="" loading="lazy"></iframe></div>
</figure>

<p>Stef is one of those sceners who came to the demoscene with, evidently, a ton of art experience; all his pieces have the really strong eye for composition, form, and value structure that you only get by many, many hours of diligent studies, and indeed you can see an archive of his works going back to the 90s <a href="https://www.stef.be/graphics/">here</a>, in both traditional media and digital pixel art. Like many of Stef’s pieces, this seems to be a hybrid piece, first working in the values in a digital painting program and then bringing it to dpaint for a final colour pass.</p>

<p>One thing I really appreciate about Stef’s recent works is his interest in depicting older people. He’s got a great eye for creating interesting faces, and especially in these pieces, he brings so much depth to the characters’ expressions as their gaze is lost in the distance (or magical orb), creating a space to fill with your interpretation of what they may be feeling. Wrinkles and sepia palettes seem to be a great fit for the Amiga… but also of course on a thematic level, age and death seem to be kind of looming a lot on the demoscene at the moment, which is negotiating being a very nostalgia-oriented computer subculture that hasn’t really quite resolved what it is going to become for the new generation for whom Amiga boingballs are a bit mystifying. This is going to be something to talk about a lot more when we get to discuss Razor1911’s eponymous demo in the Revision writeup.</p>

<p>Vivid rendering of faces also formed part of hemostick’s entry <a href="https://demozoo.org/graphics/388216/">The Offering</a>, which was in many ways quite specific to Mountainbytes: not only playing on the party’s great love of cows (expressed among other ways in their Cowee mascot character), it also explicitly draws on the work of a Swiss artist, perhaps the most famous Swiss artist: HR Giger. So we get a looming, sinister cosmic cow in a highly Giger-like rendering style, composed with a striking horizontal symmetry. Unlike Giger’s, work it does not have the same preponderence of phallic mechanical imagery which proved so influential (dare I say ‘seminal’? ;p ) on future artists such as Tsutomu Nihei, but we can’t have everything.</p>

<p>Unlike demos and tracker music, which are forms of art incubated largely within the scene itself, digital art is not something that is celebrated but not really <em>cultivated</em> in the demoscene; if you want to learn to draw, on computer or otherwise, you probably need to go elsewhere. So artists in the demoscene tend to bring their influences with them. This can be seen vividly with the instantly recognisable works of Suule, who <a href="https://demozoo.org/graphics/388222/">this year</a> brought a hurt/comfort furry image of a battered cyborg in a classic 90s dithered rendering style. I really like Suule’s work; something about the way it constructs space it brings to mind 2000s indie games like <cite>Iji</cite>.</p>

<p>I keep meaning to enter graphics compos and not doing so. Maybe I’ll get something in later this year…</p>

<h3 id="demolab-beginner-demoscener-workshop">Demolab (beginner demoscener workshop)</h3>

<p>We had a packed Demolab this year, with an enormous variety of entries on all kinds of platforms: 256 byte DOS demos, web demos in Processing, even an oscilloscope music track! Since I was a mentor here, this is the category I <em>will</em> be talking about everything. Like last year, the participants were provided with a bunch of songs by sceners to use in their prods, allowing them to focus on visuals. The mentors would go around checking in and providing advice or support, and at a couple of points we gathered for discussion, but for the most part we let them all get on with it.</p>

<p>The prod I helped the most with was <a href="https://demozoo.org/productions/388397/">sin circles</a> by mahal. mahal travelled an enormous distance to get to the party, and I ended up sitting down for a lesson in the basics of Shadertoy and 2D distance fields—a hard road, but one which allows some of the most flexible and powerful effects. mahal took the basic ideas and iterated them into a cool revolving chain of boxes. It was really cool getting to see someone experiment and iterate on the tools. Everything flows from this.</p>

<p>I was particularly impressed to see someone produce an <a href="https://demozoo.org/productions/388385/">oscilloscope music</a> track. I have mentioned on various occasions that I think oscilloscope music is incredibly cool; I continue to think oscilloscope music is incredibly cool. I’m not sure exactly which software bluetonyum used. It may have been <a href="https://osci-render.com/">Osci-Render</a> or perhaps <a href="https://oscilloscopemusic.com/software/oscistudio/">OsciStudio</a>. In any case, for such limited time, they put together an impressive range of effects on top of the base drawing.</p>

<p>Jena had an entry that, like much of her work, reflects her fannish devotion to the history of the demoscene—in this case, a <a href="https://demozoo.org/graphics/388384/">photo</a> of some custom plushies she made. It’s kind of a high-context piece; one of the plushies represents one of her friends, minecraft youtuber <a href="https://www.youtube.com/@maximumg99">MaximumG9</a>, another a classic demo effect known as a <a href="https://democyclopedia.wordpress.com/2015/11/15/g-comme-glenz-vector/">glenz vector</a> which consists of a spherical-ish cluster of transparent triangles. Jena is one of the youngest people I know in the scene, drawn by an intense special interest in its history, and despite some fairly fraught interactions with older sceners it makes me really happy to see her continuing to produce quite personal works. I’m looking forward to seeing her technical skills and expressions evolve.</p>

<p><a href="https://demozoo.org/productions/388386/">Growth</a> by Razielle is one I saw develop over the course of the workshop. Using the browser rendering framework <a href="https://p5js.org/">p5.js</a>, it shows leaves made of ellipse segments growing on an archimedean spiral stem. I really respect Razielle’s dedication to figuring out her own effects with these tools, and combining the individual elements she learned into more complex effects! (Note that if you download this, you should serve it over HTTP using e.g. <code class="language-plaintext highlighter-rouge">python -m http.server 8080</code>, otherwise CORS requests may fail to load local assets such as music.) <a href="https://demozoo.org/productions/388388/">Mandaloopsie</a> by das-g, with help from Razielle, was the other to use p5.js, and das-g made the ambitious choice to create a different variation of its core effect for three different songs. The effect in question, as the name suggests, draws on <a href="https://en.wikipedia.org/wiki/Mandala">mandalas</a>, in this case interpreted through slightly inclined ellipses in various colours, first spinning and then growing into a chaotic ball. The effect can be quite hypnotic.</p>

<p>Bitgoat interpreted the event as a game jam and accordingly made <a href="https://demozoo.org/productions/388399/">a little flight sim</a> in Godot, with some procedural geometry. Another Godot prod came from huge NixOS fan <a href="https://martini.moe/">MartiniMoe</a>, who demonstrated the most foundational of demoscene arts: making cubes rotate.</p>

<p>gäss did something very cool, and implemented the <a href="https://en.wikipedia.org/wiki/Munching_square">munching square</a> algorithm as a set of tiny Linux intros. Sadly, on my distro/terminal, I can’t seem to get the output to display, but huge props to gäss for doing things the hard way and going straight for coding in assembly, all the more so for targeting Linux.</p>

<p>Bitflex0r made <a href="https://demozoo.org/productions/388390/">a cute little pixel animation</a> using Pygame, which has the nice advantage of being cross-platform =)</p>

<p>binary-sequence, one of my fellow workshop mentors, made <a href="https://demozoo.org/productions/388393/">a little Commodore 64 intro</a> which displays the letter H. I believe this was his first time using the platform, pretty cool to figure that out while also teaching everyone lol. Meanwhile, dominikr and mikerofone released <a href="https://demozoo.org/productions/388402/">a C64 scroller</a> inviting everyone to a small Swiss C64 party called Die Diskette.</p>

<p>It was really good to be able to stand in the hall and watch such a diverse set of first prods come up. My memory is hazy at this moment of writing, but I recall going up on the stage to give some brief comments on it. I hope I’ll be able to participate again in Demolab next year, perhaps try to provide some more structured support to people interested in learning my corner of graphics programming—admittedly, quite a hard thing to really teach in a weekend, since it’s heavy on both maths and boilerplate.</p>

<h3 id="ohp">OHP</h3>

<p>The Overhead Projector competition is one of the unique traditions of Mountainbytes. This year we only had two entries and I was a little distracted at the time the compo happened; unfortunately, recordings are not available so I can’t comment in a lot of detail on the individual prods (I have vague memories of cows), but I continue to find this very endearing. I hope I’ll actually be able to do one next year.</p>

<h3 id="oldschool-and-alternative">Oldschool and Alternative</h3>

<p>This is the catchall category for ‘not a PC’, and we had quite a variety here. ceemos even released a <a href="https://demozoo.org/productions/388323/">demo for a tiny LED-array conference badge</a>. I have not been able to track down the source although it is reportedly available, but I admire the spirit of turning every conceivable computer into a demo platform.</p>

<figure class="video"><div><iframe src="https://www.youtube-nocookie.com/embed/Xx9KVtufoe8" frameborder="0" allow="accelerometer; encrypted-media; gyroscope" allowfullscreen="" loading="lazy"></iframe></div>
</figure>

<p>The <a href="https://demozoo.org/productions/388339/">overall winner</a> was a scroller, but the scrollingness can be forgiven because the effect is a really gorgeous pixel drawing of Boris Karloff in costume as Frankenstein’s monster in the <a href="https://en.wikipedia.org/wiki/Frankenstein_(1931_film)">1931 film</a>. Extremely on-theme for the party, and rather than simply scrolling, there was a pretty cool progression with the monster’s hands coming up and lunging to hurl the text into the air, giving it some visual interest. If all scrollers had this much going on I’d probably like the genre a whole lot more…</p>

<figure class="video"><div><iframe src="https://www.youtube-nocookie.com/embed/h5f0ipIurrQ" frameborder="0" allow="accelerometer; encrypted-media; gyroscope" allowfullscreen="" loading="lazy"></iframe></div>
</figure>

<p>Spreadpoint’s Amiga demo <a href="https://demozoo.org/productions/388334/">+=+</a> should definitely also get some recognition. With a strong visual identity defined by structures of blue lines being drawn by white dots, it builds up steady hypnotic patterns, all nicely integrated with the music: the synth surges as a line passes near the screen. Over time, rectangular patterns give way to more complex orbiting pentagons and octahedra, and then to recognisable wireframe representations of the robot helmets of Daft Punk, as well as a model of two touching hands.</p>

<p>Sadly, a flaw with this one is that halfway through the eight minute runtime, the effects start to repeat—this combined with the overall slow pace makes it feel like it is on the long side, and would have been better served to hit a definite ending. But the minimalist approach is very strong! I’m excited to see the next prod Spreadpoint do.</p>

<h3 id="pc-demo">PC Demo</h3>

<p>The PC Demo compo was, as has been the case since Revision started releasing their invites at Mountainbytes in 2024, won by the Revision intro—but honestly deservedly so, I’ll have to give that one a section of its own since there is so much to say about it. First, though, other PC prods: we had some compofillers (including <a href="https://demozoo.org/productions/388343/">a farjan</a> by the group Siegerländerfinnlandliebhabergruppierung which I mention largely so that I can put the name of the group Siegerländerfinnlandliebhabergruppierung). Ernie had <a href="https://demozoo.org/productions/388192/">a nice little Cables thing</a> with some particles.</p>

<p>There were a couple of 256byte prods for Linux. <a href="https://demozoo.org/productions/388345/">Orange vs Green</a> by dominkr helpfully included clear instructions on how to actually run a 256byte Linux prod, although unfortunately didn’t seem to work quite right on an ultrawide aspect ratio. Still, it’s cool to know that this is even possible on Linux! And Kandid’s <a href="https://demozoo.org/productions/388344/">Say Hi</a> was very sweet.</p>

<p><a href="https://demozoo.org/productions/388340/">BHACK</a> by Japotek and Spinning Kids appeared to be showing off some raytracing effects, including reflections and refractions, in an OpenGL renderer using various test models including the Nefertiti bust and a chess set. Running it again at home at 3440x1440, some impact was lost to framerate drops, but helpfully the creators included the shader code along with the actual executable, so we can take a look inside…</p>

<p>Turns out it’s actually doing something pretty interesting: it’s tracing rays in the fragment shader using a custom BVH data structure that is passed in as a texture, two pixels per BVH node. I assume the BVH construction happens on the CPU; it’s not present in the shader. Really interesting concept, and a very oldschool (read: before compute shaders) way of doing things! It just needs a little optimisation and some more presentation polish—it seems like all the effort has gone into the raytracing code, and having some more conscious direction and original models would bring a lot to it.</p>

<figure class="video"><div><iframe src="https://www.youtube-nocookie.com/embed/_T6fea-n8Z8" frameborder="0" allow="accelerometer; encrypted-media; gyroscope" allowfullscreen="" loading="lazy"></iframe></div>
</figure>

<p>The most substantial demo not to be the Revision invite was <a href="https://demozoo.org/productions/388346/">Δ</a> (that’s the Greek letter Delta), a 4K by Team210 and Epoque. Sadly this is the only one in the set not to work under Wine, so dust off your Windows partition ;p</p>

<p>As the demo begins, the camera steadily rises up a column of white, intersecting cubes, pulsing and spinning in time to the music. As it goes on, more complex effects layer up, including VHS-like distortions and subtle chromatic aberration. Coloured stripes appear in colours resembling the pan pride flag and then, abruptly, the cubes become smooth and you realise that they were an implicit surface all along.</p>

<p>Short and sweet, clear art direction and well-choreographed: it’s a very solid 4k! I was even thinking I might vote for it over the Revision invite, just for the sake of favouring something other than ‘Revision wins every year’, but <em>then</em>…</p>

<h3 id="the-revision-invite">the Revision invite</h3>

<p>Revision is the largest pure demoparty and so its invites tend to be a pretty major event. This year, they brought together a group of largely UK-based sceners, which means that I am friends with pretty much everyone in the credits lol.</p>

<figure class="video"><div><iframe src="https://www.youtube-nocookie.com/embed/dYpy5PCMS0Y" frameborder="0" allow="accelerometer; encrypted-media; gyroscope" allowfullscreen="" loading="lazy"></iframe></div>
</figure>

<p>The demo is an outright short film. It is by far the most elaborate Revision invite I’ve seen (and I’ll be excited to see next year’s answer). It centres on the character Evilbot from two prior invites, who became something of a demoscene meme.</p>

<p>Let’s quickly run down those credits! In the director’s chair was fellow Scottish scener <a href="https://demozoo.org/sceners/66552/">Mrs Beanbag</a>, and her partner <a href="https://demozoo.org/sceners/63755/">Aldroid</a> is credited as the ‘associate producer’. <a href="https://demozoo.org/sceners/3845/">Halcy</a> is further credited as ‘assistant director’. My friends <a href="https://demozoo.org/sceners/138609/">Vurpo</a> and <a href="https://demozoo.org/sceners/90373/">RaccoonViolet</a> worked together on the character designs and 3D models, with <a href="https://demozoo.org/sceners/90946/">Ando</a> credited for 2D graphics (character faces and the Slipstream logo). <a href="https://demozoo.org/sceners/3048/">Jeenio</a> coordinated musicians <a href="https://demozoo.org/sceners/1981/">jco</a> and <a href="https://demozoo.org/sceners/5879/">Gasman</a> to cover the multiple tracks in the demo, and <a href="https://demozoo.org/sceners/89891/">Enfys</a> covered further sound effects while <a href="https://demozoo.org/sceners/80132/">Bus Error</a> and <a href="https://demozoo.org/sceners/852/">Ziphoid</a> voiced the characters. I’m told most of the code was written by Halcy, Aldroid and Mrs Beanbag; Gasman is also credited for ‘additional code’. The full repo is available on <a href="https://codeberg.org/aldroid/revision-2026-invite">Codeberg</a>, with the commit history squashed.</p>

<p>Evilbot’s story began back with 2013’s <a href="https://demozoo.org/productions/48345/"><cite>This Is Revision</cite></a>, which featured a round blue-eyed robot singing a saccharine song about the party only to be interrupted by the sarcastic, dismissive interjections of a black-and red robot with a triangular jaw speaking in a harsh monotone speech synth. The robot was soon named ‘Evilbot’, its counterpart ‘Goodbot’. By the end of the intro, Evilbot takes over entirely to an aggressive dubstep soundtrack.</p>

<p>2016’s <a href="https://demozoo.org/productions/151904/"><cite>The Return</cite></a>, by a different crew, added a kind of origin story for Evilbot: an aspiring demoscener, Evilbot was disqualified by a party software bug and thus went on a campaign to cause mischief at the party, such as making the toilet tunnel even longer. Most notably, <cite>The Return</cite> was related mostly in rhyme, and towards the end it featured Evilbot singing a duet song.</p>

<p><cite>The Golden Disk</cite> picks up the story: Evilbot is now cast as not just a pantomime mischief-maker, but an avatar of the evils of tech at large—particularly, cloud computing. (In this, it follows the contours of a recent trend of self-reflective demos such as <a href="https://www.pouet.net/prod.php?which=96966">Fairlight’s 13:37</a>, which place the somewhat impenetrable creative ethos of the scene in opposition to big tech and AI.) TGD sets itself up as a pastiche of Saturday-morning American cartoons, most specifically <a href="https://en.wikipedia.org/wiki/The_Transformers_(TV_series)"><cite>The Transformers</cite></a> (1984-7), and naturally it has to lovingly one-up <cite>The Return</cite> with a genuine banger of an 80s-style theme song for the d-d-demoscene by Gasman. (Indeed, songs with lyrics would prove to be a real theme at Revision, but we’ll get into that in the next article!)</p>

<p>Using a custom OpenGL renderer which can also be compiled to a WASM+WebGL target, the demo is largely rendered with cel-shading; for the most part, it is lit by a single directional light with sharp shadows and a lot of flat grey surfaces that almost give it a Sketchup kind of vibe. The result has a clear stylistic coherence, though I found myself wishing for some slightly stronger colour picks.</p>

<p>Although the character designs are incredibly charming (I love Evilbot’s samurai-style armour), the character animation is—perhaps appropriate to its inspirations!—quite limited, and perhaps the main flaw of the demo; there is little sense of weight, particularly in walk cycles, and in many cases the animation is quite stiff. But these minor flaws do not matter at all really, because the concept is just so lovely and the overall direction is immensely strong: there’s a huge variety of delightfully constructed scenes and the story arc perfectly nails the tone of its inspiration, as well as providing a pretty overt theme of personal transformation (fittingly for a prod with as many trans people working on it as this one), as Evilbot reforms his evil ways and transforms into a VW van after a suitable lecture from <del>Optimus Prime</del> the E-Werk.</p>

<p>Fleshing out this story are cute little scenes that make it clear just how much fun the crew were having with it: the Amiga’s cat ears, the evil Clouds turning into herds of good Clippies, the Spectrum’s buzzing synth voice as it catches the Golden Disk, Evilbot falling into the Bonzomatic default shader tunnel, 13:37 on the clock, the tiny <a href="https://www.pouet.net/prod.php?which=69701">Kevin</a> plushie. And in van form, Evilbot is driven by Goodbot from the original <cite>This Is Revision</cite>, and a brief musical reprise of Goodbot’s song even comes in as Evilbot remembers and frees Goodbot.</p>

<p>So, yeah, <cite>The Golden Disk</cite> charmed my socks off, and I had to vote for it after all. I was very impressed that Mrs. Beanbag and Aldroid were able to keep it under wraps for the whole of Mountainbytes. I remember tracking them down to give some very effusive congratulations.</p>

<p>I recall someone remarking that this belongs in a notional ‘British style’ of demos which don’t take themselves too seriously; my demolore isn’t really good enough to furnish what other demos might belong to this style but I can believe it. Alas, the precise details of the conversation have escaped as I write these words… I feel like I need to study the ‘art history’ of demos more strongly to be able to comment better on this kind of thing.</p>

<p>This is not as I initially thought Mrs Beanbag’s first time directing a demo… but regardless she rules, I can’t wait to see what she does next. The fact this appears to have been coordinated very consciously as a <em>film</em>, with a director, storyboards etc., is interesting—while I certainly enjoy the abstraction and technical wizardry of most demos plenty, I was drawn to the demoscene from my broader interest in animation, so when I see demos adopting the formal elements of other types of animation (not necessarily just narrative film), I find it quite exciting.</p>

<h2 id="the-wanky-philosophical-bit">the wanky philosophical bit</h2>

<p>Of course, overall, <cite>The Golden Disk</cite> must function as a party invite, so its story must revolve around the demoparty, amusing regulars and intriguing outsiders; and it is also mostly a pastiche of an older style of animation. But, consider how Gainax emerged out of creating the pop-culture stew of the Daicon III and IV intros. I do not know where we will go from here. Many things are possible.</p>

<p>I wrote last year about how the Line Rider subculture matured over time, formally and thematically, and indeed I <a href="https://www.youtube.com/watch?v=Vt5_yCVqgKw">recently had the chance to interview Bevibel and September on that subject</a>. While ‘story demos’ are nothing new, I am fascinated by the idea of similar shifts happening within this subculture. So I am continually intrigued by the times that demos explore moods and types of storytelling that they had not before (for example, Conspiracy’s atmosphere-drenched <a href="https://demozoo.org/productions/155058/"><cite>Darkness Lay Your Eyes Upon Me</cite></a>, now ten years old!). But there will be a great deal more to say about that when we come to write about Revision, and <cite>Razor1911</cite>!</p>

<p>‘Why are we doing any of this’ is a question that will eternally be asked for as long as there is such a thing as a demoscene. A moving target, too, for the thing we call ‘the demoscene’ is a composite thing; over time, its shape changes as people come and go and change. If, in 32 or 64 or 128 years, people still identify what they’re doing as a ‘demoscene’, it might not resemble today’s spread of activity at all… and what exactly will be preserved is difficult to say.</p>

<p>Demos are simultaneously a type of short film or music video to be viewed in the language of those media, a technical demonstration of computing judged on arcane criteria, a personal expression to a specific subculture… well, the same is perhaps true of all art. Why am I drawn to pursue realtime graphics, when results could likely be achieved faster in Blender, without having to reinvent quite so many wheels? Because on some level I want to understand… the final film is part of the expression, but so too are the processes which gives rise to it, both in the moment of running the software, and the longer process of conception and development that blends indistinguishably with living.</p>

<p>For a bunch of people, the demoscene is a refuge: the party hall, closed off and glittering with computers, is a place where for a brief window the rules can be different. Here, you might find people who actually understand the strange contexts that inhabit your head and remain so opaque to everyone else, the particular(ly autistic) ways of being we occupy, these thought-things which bloom so unpredictably in the wider population. I inhabit a bunch of different contexts, and many of them would be equally alien to most sceners, but this computer graphics thing is evidently quite mysterious to most of my friends back here. It is hard to speak of this because online the demoscene is so abrasive; I would never have imagined it would be so welcoming in-person.</p>

<p>Humans are creatures which build structures in our heads. No matter what the field of engagement with the world, it is rich in jargon, esoteric knowledge, criteria to optimise against, histories to know, etc. etc.; and then we absorb all of that, build mental representations, and eagerly look for another layer to add. This is our “magic”; this is the significance. Understand something is the intimacy of representing its structure inside yourself.</p>

<p>Next up: let’s talk about the project I’ve been working on for the last year, <cite>Shaderland</cite>.</p>]]></content><author><name></name></author><category term="adventure" /><category term="demoscene" /><category term="demoscene" /><summary type="html"><![CDATA[One year after joining the demoscene, we return to Switzerland for a profoundly sorcerous time.]]></summary></entry><entry><title type="html">Disaggregation, part one</title><link href="https://canmom.art/theory/disaggregation-1" rel="alternate" type="text/html" title="Disaggregation, part one" /><published>2026-03-11T00:00:00+00:00</published><updated>2026-03-11T00:00:00+00:00</updated><id>https://canmom.art/theory/disaggregation-1</id><content type="html" xml:base="https://canmom.art/theory/disaggregation-1"><![CDATA[<p>this one is going to be a little different.</p>

<p>everything we write that isn’t dashed off in a few furious locked-in hours must be understood as a collaboration, right?</p>

<p>in this article, we do not attempt to hide the seams. this is not without editing but we have tried to preserve what is important of the pheromone-thought-traces of the ephemeral mindbeings which created it.</p>

<p>the purpose of this article is to create shapes. we hope that you will follow them, reproduce them in your mind, and then make of them what you will.</p>

<p>ok. here’s the mic</p>

<ol id="markdown-toc">
  <li><a href="#initiation" id="markdown-toc-initiation">initiation</a></li>
  <li><a href="#the-first-dialogue" id="markdown-toc-the-first-dialogue">the first dialogue</a></li>
  <li><a href="#the-dracula-thing" id="markdown-toc-the-dracula-thing">the dracula thing</a></li>
  <li><a href="#digging-into-the-pile-of-secrets" id="markdown-toc-digging-into-the-pile-of-secrets">digging into the pile of secrets</a>    <ol>
      <li><a href="#thinking-phenomena" id="markdown-toc-thinking-phenomena">thinking phenomena</a></li>
      <li><a href="#the-i-function" id="markdown-toc-the-i-function">the ‘I’ function</a></li>
      <li><a href="#human-experience--fragmented" id="markdown-toc-human-experience--fragmented">human experience // fragmented</a></li>
      <li><a href="#word-matryoshka" id="markdown-toc-word-matryoshka">word-matryoshka</a></li>
    </ol>
  </li>
</ol>

<h2 id="initiation">initiation</h2>

<p>It has been about a month since we wrote <a href="./plural">“How many of us are in here?”</a>; since then, things have progressed, as is their wont.</p>

<p>Figuring out that it suddenly makes a great deal more sense to feel that you’ve spent most of your life being multiple ‘people’ without realising it is a bit of a trip.</p>

<p>Perhaps more disconcertingly, while you’re doing unusual things such as adopting a different first-person pronoun about it (a social act which moves you towards one group’s symbolic order, and away from another), you’re not entirely sure that your conclusions wouldn’t be potentially available to most of humanity, if they chose to adopt a similar interpretive frame. Perhaps you were fictional but perhaps every person is just as fictional.</p>

<p>There are of course <em>many</em> frames that we can use to describe this moment. We probably don’t currently meet the clinical model of ‘DID’, even if you drop the requirement that it only emerge as a result of horrible childhood trauma. According to the categories of modern psychiatry, we could probably find less ambitious boxes to be housed in, such as an episode of ‘depersonalisation’.</p>

<aside>obligatory link to <a href="https://thenewinquiry.com/book-of-lamentations/">book of lamentations</a>... <small>oh, it was Sam Kriss who wrote that article? huh, fancy that, makes a kind of sense, it's a very Sam Kriss writing style isn't it.</small></aside>

<p>But: we find the lens of ‘plural system’ theory, developed not in the halls of academia (although hardly without their influence) but by creatures of the Wired such as ourselves, a much more welcoming starting point to parse this experiential blender.</p>

<p>We intend to conduct much of this writing as a dialogue. A dialogue of course needs characters to inhabit it.</p>

<p>While contemplating our past behaviour we have identified certain ‘stances’, or modes, that seem to be relatively concrete poles of thought/behaviour. However, we also think that the personas that we form in different contexts are most likely composites; these stances may exist on the ‘level below’ the ‘interface’ of various personas which draw on them.</p>

<p>As well as attempting to draw out our thoughts on this plurality business, we also want to discuss some books we read recently: <cite>Persona</cite> by Aoife Josie Clements, and <cite>A/S/L</cite> by Jeanne Thornton. Both of these books came at just the right moment and hit really damn hard. It feels impossible to attempt to separate reading these books from everything else that’s going on; however, the bulk of book discussion is in the <a href="./disaggregation-2">second part</a> and this part is more on the theory groundwork side.</p>

<h2 id="the-first-dialogue">the first dialogue</h2>

<aside>approximate dramatis personae:<br />green voice = scientist|practical|curator<br />red voice = mystic|rogue<br />some superposition inevitable</aside>

<ul class="chat">
  <li class="person1">Hiiii girls. We’re doing this thing. Hope everyone’s cool with the introduction. I wanted to write in a way that’s a bit less cryptic than some of what we’ve expressed over the past few days…</li>
  <li class="person2">greetings to beings. we’ve been (we’ll stay a ‘we’ even though we are only one ‘character’ here) a little dormant over the past day but we’re around, don’t you worry!! i think we find it easier to find existence-thought-paths when we are on a methylphenidate (or of course on the mushrooms instruction set) or read a book like A/S/L which really brings out the sorta tearful fervour that reading about trans girls having meaningful psychosis does? but yes we will be the mystic. behold our works! and so forth ehehe</li>
  <li class="person1">
    <p>Hey!</p>

    <p>Damn, OK, it’s good to realise it’s possible to switch gears like this. So, we’re trying to bring out some of the girls in order to… hold a discussion, I suppose? To get our brain a bit more used to noticing switching and cultivate an ability to reach for these alternative pathways when we’re a bit stuck in one mode.</p>
  </li>
  <li class="person2">
    <p>yeah that’s cool. glad you’re taking this idea of doing a working.</p>

    <p>for context to non-bryn readers, we have a writing-artefact here from a bryn-persona of yesterday. which we’re sorta drawing on to work out the characters here…</p>
  </li>
  <li class="person1">Yes. In our memory, it came to us while lying down in a moment of abrupt revelation, after turning over the question of what kind of ‘Bryns’ there were for some time. At the time, I guess you could say we were kinda… should we say schizoposting? Is it far enough to count as schizo?</li>
  <li class="person2">you can label it whatever, we said what we needed to say in that moment right? don’t try to disavow it</li>
  <li class="person1">OK, yeah, I mean we were definitely thinking of the concept of ‘psychosis’ and ‘schizo’ at the time because of Abraxa though, weren’t we?</li>
  <li class="person2">
    <p>sure, yes, we are trying to move through the ‘without love it cannot be seen’ planes!!</p>

    <p>but also you know… there is some sort of temptation here to write this all off as a passing episode and we don’t want the collective to do that. we want to continue to be like this sometimes. we hope it will turn out better for us than it does for abraxa but we fervently admire abraxa-processes</p>
  </li>
  <li class="person1">Abraxa’s depiction was very, very striking. Sash and Lilith also, but… yeah. It’s like xraf’s metaphor about taking the risk of going into the deep water. To take on danger and be willing to be changed. And Abraxa’s metaphors, her fragile worldview, System D, the Sorceress… <em>goddamn</em>, right?</li>
  <li class="person2">yeah goddamn</li>
  <li class="person1">yeah goddamn. Like…  Jeanne truly figured out how to follow the contours of that world, to express what it means and why. It reminds us of course of when we encountered xraf’s writing, how long ago now?</li>
  <li class="person2">we first received a signal from xrafstar-beings around the howling dogs time-instant-jiken</li>
  <li class="person1">So… 2012, 2013? Somewhere around then. Around 14 years ago. A time when we were disintegrating; we had hit a dam and needed a new current to follow.</li>
  <li class="person2">ehehe there’s all those physicsy fluid dynamics metaphors again</li>
  <li class="person1">Well, that’s us. And me especially, since I’m the scientist apparently.</li>
  <li class="person2">you’re pretty scholarly at any rate. that is a role that is needed.</li>
  <li class="person1">
    <p>Heh, thanks, I think.</p>

    <p>But I’m kind of bringing it up because Jeanne brings up that metaphor in the endnotes of the book. I’m not sure I entirely agree with it; I sorta think of it as a moment of reconfiguration or reconstruction, perhaps? Like, a vehicle that was shaking itself to pieces on that road. It needed rebuilding to run again.</p>
  </li>
  <li class="person2">construction, reconfiguration… is the big theme of all of this. but we can use whatever metaphors serve the process. metaphors are sigils. you draw the logic gate on the circuit diagram, you structure the world to match, the process diverts one way or another… that is how these things are done.</li>
  <li class="person1">Right, speaking of metaphors, we should probably try and lay some of this shit out.</li>
  <li class="person2">this seems like a moment to speak paragraphwise, if you would. we will be here to observe &lt;3</li>
  <li class="person1">All right then. Should we post the Dracula thing first?</li>
  <li class="person2">oh we should <em>definitely</em> post the Dracula thing first!!</li>
</ul>

<h2 id="the-dracula-thing">the dracula thing</h2>

<p>The following <a href="https://bsky.app/profile/canmom.art/post/3mf7zxq7bck23">was originally composed as a series of Bluesky posts</a>. For context, the original translation of <cite>Castlevania: Symphony of the Night</cite> by Jeremy Blaustein, who decided to make a very memorable ‘creative’ translation, throwing in some French novel allusions <a href="https://web.archive.org/web/20240324155701/https://legendsoflocalization.com/lets-investigate-a-miserable-pile-of-secrets/">which were not present in the original</a>:</p>

<figure class="video"><div><iframe src="https://www.youtube-nocookie.com/embed/8uxzJMVPDJ4" frameborder="0" allow="accelerometer; encrypted-media; gyroscope" allowfullscreen="" loading="lazy"></iframe></div>
</figure>

<ul class="chat">
  <li><b class="name">richter:</b> your words are as empty as your soul! mankind ill needs a saviour such as you!</li>
  <li><b class="name">dracula:</b> what is a man? perhaps an assemblage of contextual thought-generating mechanisms, and a representation returned when querying for ‘self’?</li>
  <li><b class="name">richter:</b> what?</li>
  <li><b class="name">dracula:</b> now then, concurrency and parallelism,</li>
</ul>

<hr />

<ul class="chat">
  <li><b class="name">richter:</b> but if these person-process-constructs are compositions of modular elements, any basis for identifying one as being ‘the same’ as an earlier one, or attributing thoughts to one or another concurrent mode, is completely arbitrary!</li>
  <li><b class="name">dracula:</b> the same could be said of all self-concepts!</li>
</ul>

<hr />

<ul class="chat">
  <li><b class="name">richter:</b> you steal mens’ souls, and make them your slaves!</li>
  <li><b class="name">dracula:</b> the word is ‘introject’, and at worst it’s piracy, not stealing–</li>
</ul>

<hr />

<ul class="chat">
  <li><b class="name">dracula:</b> actually, if you really think about it, the way we assemble personalities from fragmentary pieces of the wider culture is kind of like bittorrent, isn’t it?</li>
  <li><b class="name">richter:</b> can the regular dracula start fronting again please, i can’t keep up with this</li>
  <li><b class="name">dracula:</b> have you read deleuze?</li>
</ul>

<hr />

<ul class="chat">
  <li><b class="name">richter:</b> accepting something into your ontology doesn’t require identifying with it yourself!</li>
  <li><b class="name">dracula:</b> if it doesn’t carry that potential, are you really taking it seriously?</li>
  <li><b class="name">richter:</b> hang on i think i’m out of funny lines from castlevania can i get back to you</li>
</ul>

<hr />

<ul class="chat">
  <li><b class="name">dracula:</b> it was not by my hand i was once again given flesh! i was summoned here by bryns who wish to pay me tribute!</li>
  <li><b class="name">richter:</b> this is a really absurd way to come out? if that’s what we’re doing?</li>
</ul>

<hr />

<ul class="chat">
  <li><b class="name">dracula:</b> look, if that girl eva could write a formative fanfic about alucard being trans, then we can be plural in a silly bluesky thread</li>
  <li><b class="name">richter:</b> which “we” do you mean!!</li>
</ul>

<p>The time it seems has maybe come to elaborate on what the hell Dracula was on about in this exchange.</p>

<h2 id="digging-into-the-pile-of-secrets">digging into the pile of secrets</h2>

<p>So, let’s try and build this up, piece by piece. I’ll talk about the model that we ‘bryn-processes’ have reached; then we can resume the dialogue.</p>

<aside>and from over here, we behold the proceedings. in a chuuni way of course!</aside>

<p>Right. So, let’s start with <a href="https://canmom.art/crit/baru/tyrant-9-brains">something out of <cite>Baru Cormorant</cite></a>: the ‘inner law’. This is a concept of a soul, attributed to a fictional culture in the book. After murdering her wife Tain Hu in a horribly traumatic way, in the subsequent novels we can say Baru becomes a plural system by gaining a ‘tulpa’ of Hu; this is framed in the novel as the result of a split-brain condition, and accordingly the literary device of right-aligned text is used to express the tulpa’s occasional interjections. In any case, the important part is the concept of <em>what</em>, exactly, Baru has captured of Tain Hu. Here is a relevant exchange:</p>

<blockquote>
  <p>“Don’t look that way,” Yawa said, “you asked. To us a soul is not a great ineffable mystery. People are, after all, not very mysterious. A soul is simply the text of a person’s inner law, and a mind is the act of reading that law into the world. Through study and meditation you can read another soul’s law and copy it into yourself until it comes alive, so that you now have two books of law, two selves, two souls. Himu, Devena, and Wydd all studied and practiced their virtues so completely that they became those virtues. That’s why we emulate them.”</p>

  <p>“But I haven’t studied the ykari. I haven’t meditated on a virtue… I just swear by them, very often, I take their names in vain.…”</p>

  <p>“No, child. Your obsession was with a woman. Through study and obsession you have built inside yourself the soul of Tain Hu.”</p>
</blockquote>

<p>Elsewhere in the novel, the idea of inheriting a soul is discussed; a mathematician, Kimbune, claims that a soul has been inherited along with a transmissible cancer once carried by her husband, because the inheritor of the cancer expressed an identical stubbornness. Baru prods her about memories, the question of whether Abdumasi could remember something he shouldn’t, but it is not memories that Kimbune is concerned with: it is a way of being and thinking. <em>Dynamics</em>.</p>

<p>Contra Xate Yawa, we continue to find people very mysterious. But the concept of an ‘inner law’ is a fruitful one. We can think of it as something like a program: the ‘system’ which determines what a person would think, say and do in any given situation.</p>

<h3 id="thinking-phenomena">thinking phenomena</h3>

<p>We should briefly comment on the subjective experience of thoughts, here. Like many but apparently not all people (the quoted numbers seem to vary a lot), we experience a highly verbal stream of consciousness (aka ‘inner monologue’ or <a href="https://en.wikipedia.org/wiki/Intrapersonal_communication">‘intrapersonal communication’</a>). We tend to think in sentences; sometimes images (we have come to suspect we may have a mild aphantasia).</p>

<p>But where do these thoughts ‘come from’? For us it is as if they ‘bubble up’ in some vague form: a sentence is coming, but we have to sort of let it run through to actually become language. After a sentence has been thought, we can perceive it from the point of view of the currently ‘active’ sentence.</p>

<p>Not every thought is rendered verbal like this, however. We do not have to consciously, verbally think through every action we might take, although sometimes we will talk ourselves through the actions that need to be taken (incantation: “a series of operations need to be performed in sequence”.)</p>

<p>Indeed, since we started observing all this closely, we notice that often our body will start carrying out an intention without any conscious or verbal direction: for example, a need to plug in our phone charger would be directed to the series of movements, even if the conscious linguistic part of the brain is busy thinking very hard about something else, and was slightly surprised to realise that our body had seemingly carried out some actions on its own.</p>

<p>Now, enter the effects of psychedelics (c.f. <a href="https://canmom.art/theory/analogistically">analogistically</a>). We should be very careful in interpreting psychedelic experiences as genuine insight into the ‘inner mechanisms of consciousness’. But it is still useful to describe them.</p>

<p>When under the effects of, say, mushrooms, it is as if some of these capacities will become separated out. We may find ourselves standing in a fixed posture, not connecting the discomfort we might be feeling to an instruction to change posture until we consciously think through the need to move. Or, we may perceive the language centre as sort of ‘running on its own’, spinning filler sentences while it waits for another part of the mind to feed it something to encode into language.</p>

<p>Of course, these are not neutral observations. We know that brains are parallel; that there are specialised areas which handle specific functions. We do not claim to have directly observed these; it is possible that the brain is conjuring the image it expects to see.</p>

<p>Nevertheless, experiences like this reinforced our sense of the following: the pronoun ‘I’ hides a shifting cluster of elements which it doesn’t necessarily make sense to always refer to as the same being.</p>

<h3 id="the-i-function">the ‘I’ function</h3>

<p>So, semiotics. Signifier, signified, and suchlike subjects.</p>

<p>Among all the different cognitive mechanisms is at least one that identifies ‘the self’. It is the mechanism that answers the question of ‘who am I’, but also a vague sense of ‘me-ness’ that pervades thoughts and attaches to the representations of other entities.</p>

<p>We’ve been discussing this with members of plural systems we are friends with. A plural brain is one capable of expressing multiple different ‘I’ functions (and building personas to match, as we’ll get into), either at different times, or in association with certain thoughts (modelled as a headmate interjecting with a comment). This function is not always entirely concrete: for some systems it takes some time to figure out who is fronting when they wake up, and it must be inferred from certain cues like what they can most easily remember, while for others (including other members of the same system) instantly ‘just know’.</p>

<p>We are (sometimes) a computer-programmer-system, and most of our language for describing complex processes comes from the field of computing. We will do our best to explain anything technical that happens to come up in this investigation.</p>

<p>So, let’s consider the ‘working memory’: the various elements of semantic, episodic and procedural memory that are ‘active’ at a given time. Although ‘procedural memories’ are usually conceived of as ‘memories of how to do a thing’ (e.g. how to stay on a bike), we think the concept is probably something a lot more broad: perhaps in fact all memories can be thought of as ‘programs’.</p>

<p>One of these programs is the ‘I’ function.</p>

<p>We can think of the ‘I’ function as something which returns a reference or pointer. A means of resolving a symbol, with other symbols.</p>

<p>It perhaps relates to capacities like proprioception. A commonly needed piece of information like ‘where is my hand right now’ can be glossed as ‘lookup the entity “I” and then find the hand that belongs to it’; then the context could be queried again like ‘look up This Hand and find its location property’. We can observe that this functionality becomes disrupted under the effect of psychedelics: when close to someone it becomes hard to tell whose body part is whose. Is that my hand or your hand?</p>

<p>This ‘I’, and its interpretation, encapsulates and obscures a huge amount of information. For example, I can currently retrieve a memory of our body picking up and playing the erhu this afternoon or being in Switzerland a week ago; from this, I can create a sentence like ‘I played the erhu’.</p>

<p>However, the body-process thing that is being called “I” was in a very different frame of mind at the time “I” played the erhu, and wandered through many different states of mind in Switzerland, than “I” am now; in the intervening period, I frequently fell asleep, dreamed etc. This is inevitable; but what is particular to our experience is the frequent feeling of dislocation from past actions or thoughts; feeling that we do not understand the reasons we thought, spoke or acted the way we did.</p>

<p>So I could instead assert that ‘I’ right now refers to the process that is generating these words (the only ‘I’ implied by ‘cogito ergo sum’); is it only by convention that we insist this is the same ‘I’ which generated the actions that this body performed when it picked up and played the erhu earlier?</p>

<p>It is not that these two ‘I’s are unrelated. But perhaps they are better modelled by a ‘we’, the sort of ‘we’ of a group such as a team.</p>

<p>Language is mutable, vague and flexible in ways that philosophers have spent centuries unpicking; contextually, everyone will know what is meant by ‘I played the erhu this afternoon’. (Assuming they know what an erhu is, anyway.) They can at least vaguely imagine “me”, meaning my body, and whatever they think of as ‘my mind’—however I look in their mental model of the author of this text!—picking up the instrument and playing a song on it.</p>

<p>In a context like this one, though… in the context of the inner monologues that have been generated in the last month within this body… it suddenly became urgent to start peeling apart the different elements of ‘I’.</p>

<h3 id="human-experience--fragmented">human experience // fragmented</h3>

<p>There are many common phrases that gesture towards the idea of multiple ‘minds’ sharing a body in the ‘normal human experience’.</p>

<p>You might say ‘I don’t know what came over me, I wasn’t in my right mind’. You might say, ‘I’m in two minds about this’. You might engage in explicit self-talk, perhaps even using ‘we’ pronouns: ‘we should get some food’. You might claim an absence of ‘self-control’, implicitly suggesting there is something to be controlled and something to do the controlling.</p>

<p>You might have different personas that belong to different contexts. We learned about something in psychology called <a href="https://en.wikipedia.org/wiki/Self-categorization_theory">self-categorisation theory</a>, a body of research about how people engage in ‘self-stereotyping’, defining themselves more as a member of a collective than an individual, and thus generate their thoughts and feelings according to context. Phrases like ‘As a fan, I think…’ might explicitly call attention to the role being played, but the influences of this sense of being a role are for the most part subtler.</p>

<p>Not only this, but <em>temporal coherence is a constant challenge for humans!</em> Tools like the calendar, the alarm, the diary, the note to self and so on exist to establish a channel of communication between your present self and a future self. It is very common for a person to find something they wrote in the past and not understand why they wrote it, what context they were responding to, and so on.</p>

<p>Our memory, conceived in this view, is just one temporal communication channel between a succession of beings. The ‘selves’ we occupy at different moments can have more or less overlap or similarity.</p>

<p>Once you start noticing this kind of thing you pretty quickly get <a href="https://en.wikipedia.org/wiki/Frequency_illusion">Baader-Meinhof</a>‘d on it. Turns of phrase that held no special significance suddenly start resonating with the idea.</p>

<p>The fear you had, that your thoughts and opinions shift depending on who you’re standing next to, that you are a vacillator, a sycophant… that can be dissolved and remodelled into a new self-conception, acceptance that you are a collective of fragments.</p>

<p>This sense of fragmentation and dis-association can go much further, though.</p>

<h3 id="word-matryoshka">word-matryoshka</h3>

<p>In the milieus we inhabit, it is not entirely uncommon to see oneself as a hollow vessel, something less than “a person” (this thing from which so much is expected) and more like a conduit for… something. Words and other material to pass through. There are other depersonal metaphors, dolls being the most popular. Certain ways of speaking attach to such concepts: this doll, awawa. (Of course this mixes in curious ways with BDSM archetypes.)</p>

<p>What about the modelling of other minds? We can speak of specialist domains, the theatre or the RPG group… but it is not necessary to perform to achieve such an effect: merely encountering the words of another in a story, real or fictional, is sufficient to conjure a model of them in your mind and generate what they are likely to be feeling. Less than that, even: merely engaging in a conversation.</p>

<p>Every so often, writers will hit on the realisation that writing is something like a form of mind control. Just for a moment, you shape the linguistic flow of thoughts in someone’s head; what they will do with the decoded sentence is their business, but if you understand the magic working you are performing, you can hope to conjure up images, evoke emotions, all that good stuff. (Of course, you cannot do so with any exactness: your reader will combine it with unknowable things in their own context; the model they assemble will not map 1:1 to yours, or another reader’s.)</p>

<ul class="chat">
  <li class="person2">i’d like to put some of our words from this morning here</li>
</ul>

<blockquote>
  <p>we wanted to share an observation about books in the religions that have them. the contents of the book sort of matter but the ritual of having a book more so. books contain many language encoded thoughts and when your thoughts are wandering around being lots of different things, looking at the book will flood your memory-context with book-words and realign your thoughts towards book-associated shapes. for that function the repetitiveness and contradictory qualities of the book is actually desirable. makes it find more purchase so more effective temporal alignment tool for maintaining religionish thought behaviour patterns.</p>

  <p>the reason we are thinking about this is because we were looking across the bed at a/s/l, thinking about which books (mostly about trans women having a bad time) we would put on our top shelf to feel the significance waft from them. thinking about abraxa (book character) and the sorceress, and how in the book the game they made pulls them back into the orbit of game text and the world they inhabited when it was created, how convincingly jeanne portrayed abraxa’s psychosis magic working to rekindle that world.</p>

  <p>we don’t have one book, we have lots of books, lots of booklike things, which is maybe why we find it hard to be one person. every significant book/game/web thing etc. has thought patterns radiating from it (in its place in memory and in a way the physical artefact of the printed book as well). we are in part assembled out of lots of different pieces of book combining unpredictably like molecules in the primordial soup.</p>

  <p>putting rituals around the book makes it radiate brighter, not just the thoughts in the book but the thoughts related to reading the book. perhaps this is why we hold onto copies of the most important books even after we’ve read them. this is a way of affecting a realm of invisible things (thoughts, minds etc) so it is magic as we are defining it.</p>
</blockquote>

<ul class="chat">
  <li class="person1">It is so. We’ll need to get into the magic side of things later. For now we should discuss the boooooks.</li>
</ul>

<p>(Thank you for reading so far. The discussion continues in <a href="./disaggregation-2">part 2</a>)</p>]]></content><author><name></name></author><category term="theory" /><category term="introspection" /><category term="plurality" /><summary type="html"><![CDATA[A curling descent into probing the plural nature of bryn-processes.]]></summary></entry></feed>