<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Metamagical</title>
    <subtitle>The blog of Solly Ross</subtitle>
    <link rel="self" type="application/atom+xml" href="https://metamagical.dev/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://metamagical.dev"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2025-08-18T00:00:00+00:00</updated>
    <id>https://metamagical.dev/atom.xml</id>
    <entry xml:lang="en">
        <title>Atomic, Not Binary: Opaque Blobs in VCSs</title>
        <published>2025-08-18T00:00:00+00:00</published>
        <updated>2025-08-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://metamagical.dev/atomic-not-binary-vcs/"/>
        <id>https://metamagical.dev/atomic-not-binary-vcs/</id>
        
        <content type="html" xml:base="https://metamagical.dev/atomic-not-binary-vcs/">&lt;h2 id=&quot;a-bit-of-background&quot;&gt;a bit of background&lt;&#x2F;h2&gt;
&lt;p&gt;One of the most commonly discussed issues with &lt;a href=&quot;https:&#x2F;&#x2F;git-scm.org&quot;&gt;git&lt;&#x2F;a&gt;&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;
is the storage of binary files.&lt;&#x2F;p&gt;
&lt;p&gt;There are, broadly, two halves to this problem.&lt;&#x2F;p&gt;
&lt;p&gt;The fist half is that binary files tend to be large, and git stores a full
&lt;dfn&gt;snapshot&lt;dfn&gt; of a file every time it changes, so frequently changing
files can cause a repository to balloon in size.  This is especially
inconvenient if most people cloning the respository do not care about those
files.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;git-lfs.com&#x2F;&quot;&gt;git-lfs&lt;&#x2F;a&gt;, a git plugin written by GitHub, attempts to
resolve this, but is a bit clunky, and ends up being somewhat difficult when
multiple hosts are involved. &lt;a href=&quot;https:&#x2F;&#x2F;tylercipriani.com&#x2F;blog&#x2F;2025&#x2F;08&#x2F;15&#x2F;git-lfs&#x2F;&quot;&gt;New work&lt;&#x2F;a&gt; is being done in
git to alleviate the need for plugins and help make git more usable with large
files natively.&lt;&#x2F;p&gt;
&lt;p&gt;But, crucially, this is not &lt;em&gt;only&lt;&#x2F;em&gt; a problem for binary files -- large
text-based files also suffer from this problem (consider, for example, large
generated json files).  Nor is in inherent to binary files -- small binary
files work exacty the same as small text files here.&lt;&#x2F;p&gt;
&lt;p&gt;So, we come to the second half: diffing.  Despite git&#x27;s internals working with
snapshots, git&#x27;s user interface largely deals with diffs.  Diffs are how we
review changes to files when sharing them, how we check what&#x27;s in a commit, and
how we remind ourselves what we were working on when we get bored with a
project and abandon it for 2 years, only to pick it back up as a way to cope
with anxiety about the clusterfuck going on outside &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;A common talking point is that binary files are not diffable.  This presents a
problem to a dVCS: if you can&#x27;t diff a file, you can&#x27;t &lt;em&gt;merge&lt;&#x2F;em&gt; the changes to
the file if two or more people make changes independently.  While traditional
&lt;dfn&gt;&lt;abbr title=&quot;centralized Version Control System&quot;&gt;cVCS&lt;&#x2F;abbr&gt;&lt;&#x2F;dfn&gt;s&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#3&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; use
file locking to get around this problem &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#4&quot;&gt;4&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#13&quot;&gt;5&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;, file locking isn&#x27;t feasible in a
dVCS; one of the main points of a dVCS is that you don&#x27;t need or have a
centralized authority to mediate changes and file copying &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#5&quot;&gt;6&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;And so, if you have binary files in your repository, you&#x27;re relegated to
choosing to either abandon your own changes or overwrite someone else&#x27;s when
applying conflicting patches.  Or, manually coordinating with the people who
might also be working on those files.  Which... sucks.  It&#x27;s not great.&lt;&#x2F;p&gt;
&lt;p&gt;But! this is also not a problem &lt;em&gt;inherent&lt;&#x2F;em&gt; to binary files.
It just happens that our main tool for diffing is... outdated.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;let-s-talk-terminology&quot;&gt;let&#x27;s talk terminology&lt;&#x2F;h2&gt;
&lt;p&gt;Let&#x27;s take a step back.  When we say a file is &lt;dfn&gt;diffable&lt;dfn&gt;, what do we
mean?  A naive answer would be to say:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Given a file with 2 revisions (A and B), we call that file &quot;diffable&quot; if and
only if we can use our diff tool to produce a &lt;dfn&gt;patch&lt;&#x2F;dfn&gt; that
describes the changes to get from A to B.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;This is a clumsy definition, but it&#x27;s a start.  Let&#x27;s see if we can improve it
a bit. First of all, that last clause &quot;changes to get from A to B&quot; has a bit of
a hole in it: technically: a diff that says &quot;replace the entire contents of
the file&quot; meets this criterion.  So instead, we&#x27;ll talk about the &lt;dfn&gt;minimal set
of changes&lt;&#x2F;dfn&gt; required.  For our purposes, we&#x27;ll define that as &quot;the smallest
possible patch&quot; &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#7&quot;&gt;7&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Given a file with 2 revisions (A and B), we call that file &quot;diffable&quot; if and
only if we can use our diff tool to produce a &lt;em&gt;minimal patch&lt;&#x2F;em&gt; that describes
the changes to get from A to B.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Getting better, but there&#x27;s another hole here: we have an ambient dependendency
in our definition: &quot;our diff tool&quot;.  Let&#x27;s close that up: instead of saying
that a file is &quot;diffable&quot;, we&#x27;ll say that it&#x27;s &quot;diffable under a tool&quot;:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Given a diff tool &lt;code&gt;diff&lt;&#x2F;code&gt; and a file with 2 revisions (A and B), we call that
file &quot;diffable &lt;em&gt;under &lt;code&gt;diff&lt;&#x2F;code&gt;&lt;&#x2F;em&gt;&quot; if and only if we can use &lt;code&gt;diff&lt;&#x2F;code&gt; to produce a
minimal patch that describes the changes to get from A to B.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Alright, now our definition is shaping up.  Notice that we no longer talk about
whether a file is diffable in abstract -- instead, we talk about how it relates
to a specific tool.  Let&#x27;s do one final revision, though: let&#x27;s define how we
measure minimal. We&#x27;ll say that our diff has a &quot;unit&quot; (for example, a line), and
each piece of the diff cannot be smaller than the unit. Then:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Given a diff tool &lt;code&gt;diff&lt;&#x2F;code&gt;, a &quot;smallest possible change&quot; δ, and a file with 2
revisions (A and B), we say that a minimal patch is a patch consisting of the
fewest multiples of δ to describe the changes to get from A to B, and we call
that file &quot;diffable under &lt;code&gt;diff&lt;&#x2F;code&gt; measuring with δ&quot; if and only if we can use
&lt;code&gt;diff&lt;&#x2F;code&gt; to produce such a minimal patch.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Now, you might be saying &quot;why is that important?&quot;.  Well, a) it&#x27;s
✨foreshadowing✨, but b) assume we&#x27;re still talking about only text. Suppose
we have a diff tool that produces line-by-line diffs (like we&#x27;re used to with
the standard &lt;code&gt;git-diff&lt;&#x2F;code&gt; output) but only understands windows line endings &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#8&quot;&gt;8&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.
Per our definition above, files written on linux would not be considered
diffable under that tool; &lt;code&gt;diff&lt;&#x2F;code&gt; would consider the whole file to be one giant
line, and produce a non-minimal diff consisting of the entire file &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#11&quot;&gt;9&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;There&#x27;s another problem with our definition that&#x27;s lurking just outside the
bounds of our terminology: we need a way to compose diffs, an that involves
&lt;em&gt;merging&lt;&#x2F;em&gt;, and merging involves both humans &lt;em&gt;and&lt;&#x2F;em&gt; computers.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;let-s-talk-about-people&quot;&gt;let&#x27;s talk about people&lt;&#x2F;h2&gt;
&lt;p&gt;Consider a giant json lockfile file that&#x27;s not well-formatted for humans.&lt;&#x2F;p&gt;
&lt;p&gt;We could produce a diff of this using our standard &lt;code&gt;git-diff&lt;&#x2F;code&gt;, and it might
very well be minimal while measuring lines, or even close-to-minimal while
measuring with json nodes.  but! such a patch would not be particularly
readable, and given the types of automated changes made to such a file, it&#x27;s
probably not particularly mergable by line-wise by computers with our typical
merge algorithms.  Doubly so for humans.  Nor does it particularly make sense
to merge it as such -- it&#x27;s generated by a tool, so it likely just makes sense
to regenerate it &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#12&quot;&gt;10&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Now, this is a bit fuzzy, but all of computing is a bit fuzzy, because at the
end of the day it&#x27;s humans using the computers.&lt;&#x2F;p&gt;
&lt;p&gt;Consider an SVG file or a &lt;a href=&quot;https:&#x2F;&#x2F;www.loc.gov&#x2F;preservation&#x2F;digital&#x2F;formats&#x2F;fdd&#x2F;fdd000604.shtml&quot;&gt;.ma file&lt;&#x2F;a&gt;.  It might be formatted nicely,
we might be able to get a minimal diff measuring both line wise and
element-wise.  But, merging it doesn&#x27;t really make sense: changes to the text
of a graphics file format are not particularly reviewable as text, and merging
two sets of changes often produces nonsensical results -- the relationship
between parts of the file is visuospatial, not textual.&lt;&#x2F;p&gt;
&lt;p&gt;These files are diffable under &lt;code&gt;git-diff&lt;&#x2F;code&gt; under our previous definitions, but
doing so doesn&#x27;t really make a ton of sense.&lt;&#x2F;p&gt;
&lt;p&gt;We need some new terms.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;let-s-talk-terminology-again&quot;&gt;let&#x27;s talk terminology, again&lt;&#x2F;h2&gt;
&lt;p&gt;Let&#x27;s consider a rust source file or blog post in markdown, and compare it to
our json lockfile and svg file.&lt;&#x2F;p&gt;
&lt;p&gt;Both types of file are diffable, but the source file and markdown file and be
broken up into chunks that we can safely re-combine as humans, while the
lockfile and svg cannot.&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s call the source file and markdown file &lt;dfn&gt;compound file&lt;&#x2F;dfn&gt;s, and
the svg an &lt;dfn&gt;atomic file&lt;&#x2F;dfn&gt; (we&#x27;ll get to the lockfile in a moment).&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;ll say:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Given a file with two revisions A and B, we call the file &quot;compound&quot; if it
can be split into chunks such that we can combine chunks from A with chunks
from B and still produce a coherent file. An atomic file any file that is
not compound.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Let&#x27;s consider another example: a pallette of tiles for a 2d video game.  In
theory, it is safe to work on one tile while someone else works on another,
even though all tiles are stored in a single file. Thus, we can say that a
tileset file is compound, with its chunks being the individual tiles.
Doing so, however, would need a specialized diff tool that worked with tileset
images.  Recall our definition of &quot;diffable&quot; -- a tileset is diffable (measured
in tiles) only under a &lt;code&gt;diff&lt;&#x2F;code&gt; tool that understands tileset images.&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s revisit our lockfile: it&#x27;s not particularly easy to combine changes
text-wise, so usually we&#x27;d just regenerate it when a merge conflict happened.
However, it&#x27;d be nice if our lockfile generator could read the old lockfile and
leave any relevant locked packages in place, only deviating when a package
specifier was changed, added, or deleted from the main dependency file. That&#x27;d
get us a mostly reasonable solution, but what if instead, it could take &lt;em&gt;both&lt;&#x2F;em&gt;
old files from each revision, and only complain if the revisions specified
mutually incompatible package revisions?  Then we&#x27;d get a perfect new lockfile,
without any risk of accidentally introducing package revisions we did not
intend to.&lt;&#x2F;p&gt;
&lt;p&gt;Such a program is a &lt;dfn&gt;merge tool&lt;&#x2F;dfn&gt; -- instead of considering changes
textually, it interprets them semantically.  Similarly how to we said that a
compound file is diffable under a given diff tool, diffs for a compound file
can also &lt;dfn&gt;mergable&lt;&#x2F;dfn&gt; under a given merge tool.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-case-for-why-this-matters&quot;&gt;a case for why this matters&lt;&#x2F;h2&gt;
&lt;p&gt;Our tileset example above might be a bit academic at this point, given the
existing processes and issues around gamedev &lt;abbr title=&quot;Source Code
Management&quot;&gt;SCM&lt;&#x2F;abbr&gt;, but changing how we think about diffing and merging is
also applicable to every-day programming.&lt;&#x2F;p&gt;
&lt;p&gt;Merging lockfiles is a task causes issues today, and while line-wise diff&#x2F;merge
tooling largely works for many programming languages, AST-based tools like
&lt;a href=&quot;https:&#x2F;&#x2F;difftastic.wilfred.me.uk&#x2F;&quot;&gt;difftastic&lt;&#x2F;a&gt; can provide a much nicer
experience.&lt;&#x2F;p&gt;
&lt;p&gt;Furthermore, abandoning the preconception of &quot;binary means non-diffable and
non-mergable&quot; paves the way for us to think about programming languages which
store binary ASTs instead of text files, annotated with additional information
(consider a language that pre-computes and stores typechecking &lt;a href=&quot;https:&#x2F;&#x2F;www.unison-lang.org&#x2F;docs&#x2F;the-big-idea&#x2F;&quot;&gt;like Unison
does&lt;&#x2F;a&gt;, but does not need a
&lt;em&gt;whole&lt;&#x2F;em&gt; specialized VCS&#x2F;SCM to manage it, just some standard plugins).&lt;&#x2F;p&gt;
&lt;p&gt;Just like how it&#x27;s become common for programming languages to ship language
servers as a standard piece of dev tooling, we could have a future in which
syntax-aware diff and merge tools ship standard as well, and where our VCSs
handled compound binary files (using standard plugins shipped with the tooling
to edit those files) just as easily as they handle compound text today.&lt;&#x2F;p&gt;
&lt;p&gt;Our tools could be a lot better, we just need to think in the right frame of
reference.&lt;&#x2F;p&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;and often other &lt;dfn&gt;&lt;abbr title=&quot;distributed Version Control System&quot;&gt;dVCS&lt;&#x2F;abbr&gt;&lt;&#x2F;dfn&gt;s&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;2&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;2&lt;&#x2F;sup&gt;
&lt;p&gt;what, don&#x27;t look at me like that, you know it&#x27;s true&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;3&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;3&lt;&#x2F;sup&gt;
&lt;p&gt;e.g. &lt;a href=&quot;https:&#x2F;&#x2F;www.perforce.com&#x2F;&quot;&gt;Perforce&lt;&#x2F;a&gt;, the favorite VCS of gamedevs.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;4&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;4&lt;&#x2F;sup&gt;
&lt;p&gt;For example, this is how &lt;a href=&quot;https:&#x2F;&#x2F;portal.perforce.com&#x2F;s&#x2F;article&#x2F;3114&quot;&gt;Perforce
works&lt;&#x2F;a&gt;
(&lt;a href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20250000000000*&#x2F;https:&#x2F;&#x2F;portal.perforce.com&#x2F;s&#x2F;article&#x2F;3114&quot;&gt;permalink&lt;&#x2F;a&gt;)&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;5&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;6&lt;&#x2F;sup&gt;
&lt;p&gt;there is an argument that in this day and age GitHub effectively
functions as such a centralized authority.  Whether or not that&#x27;s true, the
&lt;em&gt;mentality&lt;&#x2F;em&gt; with which users use Git remains distributed: anybody can go
off and start working on a patch on their own, then create a PR or send a
patch in -- they don&#x27;t need to somehow be blessed with write access to a
repository to do so &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#6&quot;&gt;11&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;6&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;11&lt;&#x2F;sup&gt;
&lt;p&gt;...execpt in some corporate uses of GitHub, where forking is turned off.
Then you need write access.  That&#x27;s a bad model that discourages
transparency and collaboration between teams at a company.  But that&#x27;s a
blog post for another day.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;7&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;7&lt;&#x2F;sup&gt;
&lt;p&gt;yes, yes, i know i&#x27;m still handwaving a bit.  One definition here might
be: if we say that we have a patch language consisting of an operation
&lt;code&gt;change(range-from, range-to, contents)&lt;&#x2F;code&gt; that change chunks of the file
at the given ranges, we can say that the total size of of the patch
is the sum of the size of the &lt;code&gt;contents&lt;&#x2F;code&gt; of each operation in the patch.
There&#x27;s still a hole here, but we&#x27;ll get to it in a minute.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;8&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;8&lt;&#x2F;sup&gt;
&lt;p&gt;that is, &lt;code&gt;\r\n&lt;&#x2F;code&gt; instead of just &lt;code&gt;\n&lt;&#x2F;code&gt; on linux, or &lt;code&gt;\r&lt;&#x2F;code&gt; on some very old
systems.  the distinction these days is mostly &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#9&quot;&gt;12&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; a historical artifact.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;9&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;12&lt;&#x2F;sup&gt;
&lt;p&gt;...mostly. brief aside: &lt;code&gt;\r&lt;&#x2F;code&gt; stands for &quot;carriage return&quot; (sometimes
written &lt;code&gt;CR&lt;&#x2F;code&gt;), and &lt;code&gt;\n&lt;&#x2F;code&gt; stands for &quot;line feed&quot; (sometimes written &lt;code&gt;LF&lt;&#x2F;code&gt;).
Back in typewriter days, carriage return moved the typewriter carriage back
to its starting position, while line feed scrolled the paper down a line.
This was carried over into the teletype era &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#10&quot;&gt;13&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;, and then into the modern
era.  These days, very few things treat &lt;code&gt;\r&lt;&#x2F;code&gt; and &lt;code&gt;\n&lt;&#x2F;code&gt; separately.  However,
the &lt;a href=&quot;https:&#x2F;&#x2F;www.digiater.nl&#x2F;openvms&#x2F;decus&#x2F;vax90b1&#x2F;krypton-nasa&#x2F;all-about-sixels.text&quot;&gt;sixel&lt;&#x2F;a&gt;
graphics API that originally appeared on DEC terminals retains a separate
concept of carriage returns and line feeds -- you write all the pixel positions
of a single color in one go, and then &lt;code&gt;CR&lt;&#x2F;code&gt; back to the beginning of the line
and write pixel positions for a new color, and so on, only &lt;code&gt;LF&lt;&#x2F;code&gt;-ing when you&#x27;re
done with a line.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;10&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;13&lt;&#x2F;sup&gt;
&lt;p&gt;per the &lt;a href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20220408110814&#x2F;http:&#x2F;&#x2F;ftp.vim.org&#x2F;pub&#x2F;vim&#x2F;doc&#x2F;book&#x2F;vimbook-OPL.pdf&quot;&gt;vim
book&lt;&#x2F;a&gt;,
page 120, apparently part of this reason this was carried was to prevent
smudging -- the extra time it took to transmit the &lt;code&gt;LF&lt;&#x2F;code&gt; after the &lt;code&gt;CR&lt;&#x2F;code&gt; gave
the printer time to finish returning the print head.  &lt;code&gt;CR&lt;&#x2F;code&gt; was also apparently
involved in overwriting to make bold text.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;11&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;9&lt;&#x2F;sup&gt;
&lt;p&gt;&quot;wait&quot;, i hear you asking, &quot;wouldn&#x27;t that patch still be minimal if our
&#x27;lower bound&#x27; is still lines?&quot;.  Sure, but crucially, the lower bound of
our measurement might not be the lower bound our diff tool uses.  Here, we
consider a line terminated by &lt;em&gt;any&lt;&#x2F;em&gt; newline to be our lower bound for measuring
the minimality of a patch, while our imagined &lt;code&gt;windiff&lt;&#x2F;code&gt; only considers
&lt;code&gt;\r\n&lt;&#x2F;code&gt;, so &lt;code&gt;windiff&lt;&#x2F;code&gt; does not perform favorably.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;12&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;10&lt;&#x2F;sup&gt;
&lt;p&gt;with the caveat of &quot;regenerating it might produce slightly different results than
some theoretical merging&quot;, but often the results are identical or close enough
since the regeneration can be done by feeding in one of the two original files
as a base.  Ideally, we&#x27;d be able to feed in both files.  We&#x27;re getting there.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;13&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;5&lt;&#x2F;sup&gt;
&lt;p&gt;i have been informed by one of my awesome gamedev friends that file
locking is also used in gamedev to prevent changes to approved assets. this
is an interesting workflow to me, because it is somewhat antithetical to
the way i am used to thinking about code and releases -- in my usual realm,
approval comes from reviews, and approval management is done with
owners&#x2F;permissions lists (and it&#x27;s just assumed that if you&#x27;re an owner
you&#x27;re going to do a reasonable job). but! my understanding is that
gamedevs often work under a very different set of constraints, and it&#x27;s
always interesting to see the ways that affects tooling and processes.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Other Poetry I Like</title>
        <published>2024-11-21T00:00:00+00:00</published>
        <updated>2024-11-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://metamagical.dev/poetry/liked/"/>
        <id>https://metamagical.dev/poetry/liked/</id>
        
        <content type="html" xml:base="https://metamagical.dev/poetry/liked/">&lt;p&gt;Just doing a quick archive, cause a lot of this stuff is from my cohost, which will shut down soon.
Stuff with semi-durable links will be linked, stuff with transient links (e.g. the bird site) is
transcribed so that it doesn&#x27;t disappear into the ether.&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;re on this list and you have a more canonical location, i&#x27;m happy to link there instead.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;sAbbGEEstjc&quot;&gt;&quot;Dear White Girls in My Spanish Class&quot;&lt;&#x2F;a&gt; by Ariana Brown&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=me4_QwmaNoQ&quot;&gt;&quot;Like Totally Whatever&quot;&lt;&#x2F;a&gt; by Melissa Lozada-Olivia, &lt;a href=&quot;https:&#x2F;&#x2F;genius.com&#x2F;Melissa-lozada-oliva-like-totally-whatever-annotated&quot;&gt;transcribed&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;unnamed&lt;&#x2F;em&gt; by @angelrightsnow (originally posted on the bird site)&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
a broken clock is right twice a day
and if a clock can muster that...
then you&#x27;d be shocked by
what a broken person can do
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;from &quot;On Earth We&#x27;re Briefly Gorgeous&quot; by Ocean Vuong&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
&quot;You&#x27;re not a monster,&quot; I said. But I lied.
What I really wanted to say was that a
monster is not such a terrible thing to
be. From the Latin root monstrum, a
divine messenger of catastrophe, then
adapted by the Old French to mean
an animal of myriad origin: centaur,
griffin, stayr. To be a monster is to be
a hybrid signal, a lighthouse: both
shelter and warning at once.
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&quot;T4T Awareness Week&quot; (posted by @oauthboundFamiliar, afaict the original
source is a lex poster from The Bay)&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
sometimes
I wish to pass
wish for invisibility
dodge their awareness

sometimes
I love being a monster
love how they stare in horror&#x2F;arousal
shine so bright they can&#x27;t look away

and sometimes (most times)
I just want the touch, claw, bite
of a creature like me
someone who gets it

⚧️💖
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;amalelmohtar.com&#x2F;sour-milk-bitter-herbs-and-a-word-containing-grief&#x2F;&quot;&gt;&quot;Qahr&quot;&lt;&#x2F;a&gt; by Amal El-Mohtar&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Explaining Time to My Dog&quot; by &lt;a href=&quot;https:&#x2F;&#x2F;www.katgiordano.com&#x2F;&quot;&gt;Kat Giordano&lt;&#x2F;a&gt;
(afaict this one was never posted anywhere but the bird site, briefly, and
the picture&#x2F;story site)&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
a work day is sixteen walks long—eight of those big ones,
where we don&#x27;t make that left turn off 14th and pass the
house with the year-round inflatables. a year is the time
between when the other houses take their inflatables
down and when they put them back out, the time between
fireworks finales, but also the time it takes me to walk to
the mailbox and back with you staring out the window. but
also the time it takes for me to run a 5k in the morning. in
other words, a year is also 30 minutes. 30 minutes is the
length of a walk, but also the refractory period after a walk
before i have to start spelling it again instead. i&#x27;m sorry, but
it is what it is. we all have words the people we love can&#x27;t
say to us, not because they&#x27;ll hurt us but because itll feel
too good too fast and your feelings are scary, that look on
your face when you&#x27;re running full-tilt at someone who&#x27;s
not ready yet, who&#x27;s still putting their shoes on. it&#x27;s the not-
readiness they&#x27;re afraid of, the way it makes them feel to
see you feeling. the way they wish they had something to
say other than &quot;wait&quot; and the way they can&#x27;t define that
word. it hurts, but you figure it out eventually, the sounds
of the letters, the shapes of them in their mouths, the
certain way they breathe, like their hand is already on the
leash across the room.
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;beestungmag.com&#x2F;issue18&#x2F;two-poems-by-nora-hikari&#x2F;&quot;&gt;&quot;The Most Holy Day of the Transsexual Calendar&quot; &#x2F; &quot;Greed&quot;&lt;&#x2F;a&gt; by Nora Hikari&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Happy Birthday&quot; by Nora Hikari (afaict this was only posted on the bird site)&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
Happy Birthday

I think you could be born young,
doing something you shouldn’t be,
bathed in peach light and seeing
everything that could ever happen to you
splayed out like body on canvas.
Tiresias robed in greentext
asking you a question
you know the answer to.

I know a boy who was born at 17,
trembling at Warped Tour, carved open
by the angle of Gerard Way’s hips.
I heard he dropped right there,
like an angel, his friends crowding
him and cooing like new mothers,
which, of course, they were,
and he stood up, exactly the same
but put together the right way.

I was born in a crowd, caught
cross-legged by a song about
caskets cracking open for daughters.
I heard her voice break and I cried,
because I too knew how to break,
and so I did. I broke apart like
the bright crust of a melon bun
and went home for the first time.

Happy birthday. Come home.
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&quot;The God of Broken Things&quot; by Andrea (@CERESUltra) (originally posted on cohost), &lt;a href=&quot;https:&#x2F;&#x2F;on.soundcloud.com&#x2F;7yPUU&quot;&gt;my recording&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
I saw the god of broken things
Watched it patch tires
Reunite families
Debug code
Set bones

And cradle crying what was beyond fixing
Mourning stuff perhaps never even missed

Somewhere it became
The god of neurodivergents
The mental health strugglers
The disabled
The queer
Not because any were broken
Not by default
But because
so many prayers
That came to it
And it could not stand
To watch from a distance
And do nothing

I saw the god of broken things and did not realize how well it knew my secret voice
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;extracts from PvP poetry time on the bird site: some person posted that erasure poetry was heresy.
poetry ensued.&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;a lot of small poems&lt;&#x2F;summary&gt;
&lt;p&gt;Original:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
IMO, &quot;erasure poetry&quot; is not poetry in any way. And to destroy someone else&#x27;s writing&amp;emdash;or, God forbid, poem&amp;emdash;and then call the leftover words a new &quot;poem&quot; is pure philistinism.
&lt;p&gt;Fight me.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;@mlifonos&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
reposession, theft or new life
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;@ImLaurenTheresa&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
O,
to destroy someone else’s God
or, poem—and then
Fight.
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;@carma_t&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
&quot;Poetry is poetry in any way
and to God
—the leftover words&quot;
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;@poetryalpastor&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
agree
poetry is not in
any
writing or God or poem—
the poem is in
me
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;@misterdullboy&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
poetry is in
God—and the leftover words
are me
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;@boyleafie&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
I&#x27;M
someone else&#x27;s God
call the words
pure sin
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;@xenofem&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
poetry is poetry in any way to
destroy me
and
delight me.
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Talia Ringer&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
Erasure is
poetry
To destroy 
god
Call the
words a new
Pure 
Me
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;@poetryalpostor&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
No
Poetry is
to destroy
God,
call the leftover words
pure
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;details&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;unnamed&lt;&#x2F;em&gt; by @spiders (originally posted on cohost, in tiny text)&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
sorry
i was tired
and so moody.
i got little sleep,
and i regret that you,
one of my dearest friends,
were forced to put up with
entirely suboptimal performance.
i understand that i have likely inflicted
irrepairable harm, having demonstrated
without doubt that i am completely unfit for service
as a companion, and you now see that i&#x27;m no person
but a brood-parasite, yes- an insidious, hungry imposter
and, i am quite afraid to say it but i find it horribly likely that
by mere exposure to me in my most toxic and wretched state
you have come under a curse that has haunted me since childhood
(if not across multiple lives) which dooms me to fail in every endeavor
and severs my ability to impact the flow of events surrounding my life
in all but the most quotidian of ways, leaving me untethered from causality;
i have long known this day would come, when my silence on this grave matter
would injure a loved one, but i feared it&#x27;d scare you off, so i kept quiet. sorry.

(i will try to do better next time.)
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.opiamag.com&#x2F;store&#x2F;issue-1&#x2F;&quot;&gt;&quot;Second Date Deadname Swap&quot;&lt;&#x2F;a&gt; by Nora Hikari (posted on cohost by the author originally, which is why I feel comfortable transcribing it here)&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
Second-Date Deadname Swap

So it’s trading Magic the Gathering cards.
So it&#x27;s swapping old drawings
of hard-secret girlsonas
It’s the sending of the buried photos
of your high school self; a library forbidden to everyone
except the woman you’re currently
trying to sleep with. It’s clear to everyone
that you never expected to make it this far.
All these escape fantasies are about teenagers.

Maybe that’s what these rituals are for.
There’s nothing sexier than being alive.
I give you my soft parts for your hands;
all of my names, all of my bodies,
all of the people I want to no longer be.
Your tears taste so hot, babe.
You stink like alive and I love it.
Say it. Say it again. Say it with me. Please.
&lt;em&gt;We made it we made it we made it.&lt;&#x2F;em&gt;
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&quot;ⁿ.ⁿ&quot; by @theophage (originally on cohost)&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
ⁿ.ⁿ

Today&#x27;s gender:
Scales and tails, claws and maw
Endless hunger, battles without number, and a need for the unjust world to be torn asunder
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&quot;There&#x27;s a spot on my couch&quot; by Sylvia Lilith (estrogen-and-spite) (originally posted on cohost)&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
There’s a spot on my couch
I keep open for you
It’s yours for when
you want to sit

We can laugh at a movie
You can lean against me
And I’ll put my arm
Around your waist

You can lay there
Your head in my lap
My hands in your hair
Gentle scratches

You can stretch there
Give me that impish grin
And I curl down
Lip to lip and smile to smile

You can curl up there
And I can hold you close
And scratch your back
Whisper “it’s going to be all right”

There’s a spot in my life
I keep open for you
It’s on my couch
And everywhere else too
&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Find&quot; by Rachel Barenblat (transcribed a lot on tumblr, having a hard time finding an official source)&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
If I had any pull with God, everything you need
would appear right now in front of you.
A door would open and inside it
a rose-strewn path, the yearned-for embrace.
I’d take the broken pieces of the afikomen
and restore them as if by magic.
But that isn’t how it works. God isn’t
a diner waitress saying what can I get you, hon?
That’s why our sages taught: a clay vessel
is purified when it breaks and is glued.
A human heart, charged with a lifetime’s losses
becomes real when lovingly mended.
All I can do: ask God to cradle your heart
in Her own hands and make you whole.
&lt;&#x2F;pre&gt;  
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http:&#x2F;&#x2F;www.auroralevinsmorales.com&#x2F;blog&#x2F;vahavta&quot;&gt;&quot;V&#x27;ahavta&quot; by Aurora Levins Morales&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.poetryfoundation.org&#x2F;poems&#x2F;51642&#x2F;invictus&quot;&gt;Invictus&lt;&#x2F;a&gt; by William Ernest Henley&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.poetryfoundation.org&#x2F;poems&#x2F;46569&#x2F;do-not-go-gentle-into-that-good-night&quot;&gt;Do Not Go Gentle Into That Good Night&lt;&#x2F;a&gt;
by Dylan Thomas&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>I Want to Say Your Name (TDoR 2024)</title>
        <published>2024-11-20T00:00:00+00:00</published>
        <updated>2024-11-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://metamagical.dev/poetry/personal/tdor-mini-2024/"/>
        <id>https://metamagical.dev/poetry/personal/tdor-mini-2024/</id>
        
        <content type="html" xml:base="https://metamagical.dev/poetry/personal/tdor-mini-2024/">&lt;p&gt;(originally posted at &lt;a href=&quot;https:&#x2F;&#x2F;bsky.app&#x2F;profile&#x2F;did:plc:3nei4lvpwagyfqizd4mqyyko&#x2F;post&#x2F;3lbfubzbmo22i&quot;&gt;https:&#x2F;&#x2F;bsky.app&#x2F;profile&#x2F;did:plc:3nei4lvpwagyfqizd4mqyyko&#x2F;post&#x2F;3lbfubzbmo22i&lt;&#x2F;a&gt;)&lt;&#x2F;p&gt;
&lt;pre class=&quot;poem&quot;&gt;
i want say your name when i mention a shitpost you made to friends,
when i&#x27;m talking about how cool your art is,
when i&#x27;m recalling a tip you gave me.

i want to say your name when i meet you irl for the first time,
when u make a groan-worthy pun,
when i&#x27;m introducing you to friends.

i want to say your name for any reason, on any day, 
other than this reason, on this day:

i do not *want* to say your name because you can no longer say it yourself,
because it is TDoR.

live, please, so that we may speak our names together.

live, please, so that for a while longer still it is your life that is a blessing, 
not just your memory
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>TDoR 2024</title>
        <published>2024-11-20T00:00:00+00:00</published>
        <updated>2024-11-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://metamagical.dev/tdor-2024/"/>
        <id>https://metamagical.dev/tdor-2024/</id>
        
        <content type="html" xml:base="https://metamagical.dev/tdor-2024/">&lt;p&gt;It&#x27;s Trans Day of Rememberance today, again.  The &lt;a href=&quot;https:&#x2F;&#x2F;beestungmag.com&#x2F;issue18&#x2F;two-poems-by-nora-hikari&#x2F;&quot;&gt;day we name those who can no
longer name themselves&lt;&#x2F;a&gt;.  Too many names got added to that list this
past year, as has been the case ever year since I started observing it. One
thing idea I&#x27;ve been trying to hold on to these past few years is this idea of
&lt;a href=&quot;https:&#x2F;&#x2F;folklife.si.edu&#x2F;magazine&#x2F;we-will-outlive-them-yiddish-song-protest-slogan&quot;&gt;&lt;span dir=&quot;rtl&quot;&gt;מיר וועלן זײ איבערלעבן&lt;&#x2F;span&gt;: &quot;we will outlive
them&quot;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;It is a story of jews from the Holocaust, a story of people defiant in the
face of death, a story of folks who spit in the face of their oppressors.
And it was true: nazi germany is gone &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;, but I am here, jewish and queer
and transgender as ever.&lt;&#x2F;p&gt;
&lt;p&gt;The story originated with jews, but it applies to trans folks as well:&lt;&#x2F;p&gt;
&lt;p&gt;We have always been, and we will always be.  We have been engineers and
musicians, priestesses and monks, sex workers and soliders, emperors and
knights, and all range of other folk.  When they are dead, we will still be
around, and some amongst their children&#x27;s children will count themselves among
our number.&lt;&#x2F;p&gt;
&lt;p&gt;So live. Know that any win of theirs is ephemeral, but fight tooth and nail
against it none-the-less.  Do not give them that momentary victory. Live. Live
to find joy some day.  Live to rub it in their faces, live so that they do not
get the satisfaction of our fear and sorrow. Live to show them that they may
kill one of us, but the rest of are undaunted.  Live so that the memory of
those who are gone stays alight.  Live because we remember our own names but
someday theirs will be forgotten.  Live to pass on what you learned to the next
generation. Live to see the world become a better place, to make the world a
better place in whatever way you can.&lt;&#x2F;p&gt;
&lt;p&gt;Live, and remember those who did not.&lt;&#x2F;p&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;despite, unfortunately, Nazis still being around&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Walk (A Reminder to Myself)</title>
        <published>2024-09-10T00:00:00+00:00</published>
        <updated>2024-09-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://metamagical.dev/poetry/personal/walk/"/>
        <id>https://metamagical.dev/poetry/personal/walk/</id>
        
        <content type="html" xml:base="https://metamagical.dev/poetry/personal/walk/">&lt;aside class=&quot;note&quot;&gt;
&lt;p&gt;Originally, I posted this as a &lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;directxman12&#x2F;status&#x2F;1820659498211819562&quot;&gt;QT on Twitter&lt;&#x2F;a&gt; on 2024&#x2F;08&#x2F;05, as it just kinda came to me,
but I ended up liking what I wrote, so I wanted to reformat it here.&lt;&#x2F;p&gt;
&lt;&#x2F;aside&gt;
&lt;pre class=&quot;poem&quot;&gt;
walk.

when the demons are screaming, walk.

put on your shoes, set your music to shuffle, pick a direction, and walk.

let your feet choose the path. walk.

walk until you&#x27;ve outrun your thoughts, walk until the demons fall behind,
walk until your feet bleed
    and your legs ache
        and you&#x27;re only moving forward by sheer momentum.

walk until the only thing you can hear in your head is the music,
    then walk some more.

walk until the only thing that&#x27;s left is sound and smell and light.

walk because it&#x27;s better than the alternative.
walk so that you can walk tomorrow.

walk because one day you&#x27;ll wake up and realize that you don&#x27;t have to walk any more,
    walk because one day you&#x27;ll walk for fun,
    you&#x27;ll walk to be in the moment rather than escape from it.

walk because one day it&#x27;ll be better.

because it &lt;em&gt;does&lt;&#x2F;em&gt; get better.
&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;details&gt;
&lt;summary&gt;the original text&lt;&#x2F;summary&gt;
&lt;p&gt;(split up as the original tweets are)&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;walk.  when the demons are screaming, walk.  put on your shoes, set your music to shuffle, pick a direction, and walk. let your feet choose the path. walk. walk until you&amp;#39;ve outrun your thoughts, walk until the demons fall behind, walk until your feet bleed and your legs ache
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;and you&amp;#39;re only moving forward by sheer momentum.  walk until the only thing you can hear in your head is the music, then walk some more. walk until the only thing that&amp;#39;s left is sound and smell and light. walk because it&amp;#39;s better than the alternative. walk so that you can walk
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;tomorrow. walk because one day you&amp;#39;ll wake up and realize you don&amp;#39;t have to walk any more, walk because one day you&amp;#39;ll walk for fun, you&amp;#39;ll walk to be in the moment rather than to escape from it.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;walk because one day it&amp;#39;ll be better.  because it *does* get better.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;(but also if your feet are bleeding maybe get better shoes, future me)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;details&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;but also if your feet are bleeding maybe get better shoes, future me&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Summoning Some Nix Daemons While Wearing a Hat</title>
        <published>2023-07-26T00:00:00+00:00</published>
        <updated>2023-07-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://metamagical.dev/nix-fedora-daemon-woes/"/>
        <id>https://metamagical.dev/nix-fedora-daemon-woes/</id>
        
        <content type="html" xml:base="https://metamagical.dev/nix-fedora-daemon-woes/">&lt;aside class=&quot;tldr&quot; aria-label=&quot;tl dr&quot;&gt;
&lt;h1 id=&quot;tl-dr&quot;&gt;TL;DR:&lt;&#x2F;h1&gt;
&lt;p&gt;If you&#x27;re using nix on non-NixOS, your nix daemon keeps disappearing on reboot,
and you have &lt;code&gt;&#x2F;nix&lt;&#x2F;code&gt; on a separate partition, it&#x27;s likely a mount-and-init
issue.&lt;&#x2F;p&gt;
&lt;p&gt;To fix, you&#x27;ll likely need to mount &lt;code&gt;&#x2F;nix&lt;&#x2F;code&gt; in the initrd.&lt;&#x2F;p&gt;
&lt;p&gt;On Fedora:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;add your &lt;code&gt;&#x2F;nix&lt;&#x2F;code&gt; partition &lt;code&gt;&#x2F;etc&#x2F;fstab.sys&lt;&#x2F;code&gt; (create if missing)&lt;&#x2F;li&gt;
&lt;li&gt;regenerate dracut&lt;&#x2F;li&gt;
&lt;li&gt;add &lt;code&gt;rd.lvm.lv=your&#x2F;nix-volume&lt;&#x2F;code&gt; (e.g. &lt;code&gt;rd.lvm.lv=primary&#x2F;nix&lt;&#x2F;code&gt;) to
your kernel command line (if using LVM)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;If you want the above in the form of a snarky essay written
by an exhausted dev, keep reading below.&lt;&#x2F;p&gt;
&lt;&#x2F;aside&gt;
&lt;p&gt;Suppose, like, me, you are a &lt;a href=&quot;https:&#x2F;&#x2F;nixos.org&quot;&gt;NixOS&lt;&#x2F;a&gt; girlthing &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;. Suppose
then, (tragedy of tragedies) that you are forced by grave and terrible
extenuating circumstances to use a non-deterministic, impure, imperative (gasp)
operating system (i.e. not NixOS) on your trusty ThinkPad.&lt;&#x2F;p&gt;
&lt;p&gt;&quot;Never fear!&quot; you declare &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;, &quot;I&#x27;ll just &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;DeterminateSystems&#x2F;nix-installer&quot;&gt;run Nix on something
else&lt;&#x2F;a&gt;&quot;. Hmm, but what something else?  Perhaps Fedora, you think
to yourself, since that has an actually-up-to-date kernel &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#3&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.  So, you go to
&lt;a href=&quot;https:&#x2F;&#x2F;alt.fedoraproject.org&#x2F;&quot;&gt;install Fedora&lt;&#x2F;a&gt;, find yourself face-to-face
with a &lt;em&gt;delightful&lt;&#x2F;em&gt; &lt;a href=&quot;https:&#x2F;&#x2F;fedoraproject.org&#x2F;wiki&#x2F;Blivet-gui&quot;&gt;installer partitioning tool&lt;&#x2F;a&gt;, and have some fun
with partitions, putting the Nix store on a shiny separate LVM volume &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#4&quot;&gt;4&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; so
you can resize it later if you &lt;del&gt;install 17 versions of Haskell&lt;&#x2F;del&gt; need more
space.&lt;&#x2F;p&gt;
&lt;p&gt;You boot Fedora, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;DeterminateSystems&#x2F;nix-installer&quot;&gt;install Nix&lt;&#x2F;a&gt;, set up &lt;a href=&quot;https:&#x2F;&#x2F;nix-community.github.io&#x2F;home-manager&#x2F;index.html&quot;&gt;home-manager&lt;&#x2F;a&gt;, and are
off to the races. &quot;Wonderful! Superb!&quot;, you declare, and, your work for the day
done, you shut down your laptop. Unbeknownst to you, however, you&#x27;ve just made
a &lt;a href=&quot;https:&#x2F;&#x2F;media.tenor.com&#x2F;8cbRhKy2Z1YAAAAC&#x2F;lightning-weather.gif&quot;&gt;grave mistake&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;See, when nix installs itself on non-NixOS systems, it sets up a pair of
systemd unit files (&lt;code&gt;nix-daemon.service&lt;&#x2F;code&gt;, and &lt;code&gt;nix-daemon.socket&lt;&#x2F;code&gt;) that manage
the daemon. Unfortunately, init systems &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#5&quot;&gt;5&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;. Particularly, systemd is in
charge of managing both unit files and mounts.  To do this, it reads its unit
files &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#6&quot;&gt;6&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;, including mounts, and &lt;em&gt;then&lt;&#x2F;em&gt; starts stuff.  This means we have an
ordering issue: it&#x27;ll try to read our &lt;code&gt;nix-daemon&lt;&#x2F;code&gt; unit file before &lt;code&gt;&#x2F;nix&lt;&#x2F;code&gt; is
mounted, and find yourself with a case of missing services.&lt;&#x2F;p&gt;
&lt;p&gt;The fix, then, is to mount &lt;code&gt;&#x2F;nix&lt;&#x2F;code&gt; &lt;em&gt;before&lt;&#x2F;em&gt; systemd starts, but since systemd is
normally in charge of mounts, we&#x27;ve gotta do a little trickery.  In particular,
we&#x27;ll use the initrd.  The initrd is normally in charge of mounting the root
partition so we can actually boot off of it, plus some other tidbits of early
setup.&lt;&#x2F;p&gt;
&lt;p&gt;Thankfully, Fedora&#x27;s initrd system, &lt;a href=&quot;https:&#x2F;&#x2F;wiki.gentoo.org&#x2F;wiki&#x2F;Dracut&quot;&gt;Dracut&lt;&#x2F;a&gt;[^7]&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#8&quot;&gt;7&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; is pretty
flexible, so we can ask it to mount extra volumes by adding relevant entries to
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dracutdevs&#x2F;dracut&#x2F;blob&#x2F;master&#x2F;modules.d&#x2F;95fstab-sys&#x2F;mount-sys.sh&quot;&gt;&lt;code&gt;&#x2F;etc&#x2F;fstab.sys&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, which is almost exactly like normal
&lt;a href=&quot;https:&#x2F;&#x2F;media.tenor.com&#x2F;cjQBQCbyr2EAAAAC&#x2F;killed-em-hold-this.gif&quot;&gt;&lt;code&gt;&#x2F;etc&#x2F;fstab&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; but gets processed sooner &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#9&quot;&gt;8&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.  You may need to create
the file, but you can just copy the relevant line from &lt;code&gt;&#x2F;etc&#x2F;fstab&lt;&#x2F;code&gt;, since they
have the same format.&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;ll also need to tell the kernel it&#x27;s allowed to process the volume we want
to mount -- by default, Fedora is set up using &lt;a href=&quot;https:&#x2F;&#x2F;mirrors.edge.kernel.org&#x2F;pub&#x2F;linux&#x2F;utils&#x2F;boot&#x2F;dracut&#x2F;dracut.html#_lvm&quot;&gt;&lt;code&gt;rd.lvm.lv&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
which restricts the initrd to working with only the lvs listed &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#10&quot;&gt;9&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;. Add an
extra kernel flag in &lt;code&gt;&#x2F;etc&#x2F;defaults&#x2F;grub&lt;&#x2F;code&gt; (grub2) or &lt;code&gt;&#x2F;etc&#x2F;kernel&#x2F;cmdline&lt;&#x2F;code&gt;
(systemd-boot): &lt;code&gt;rd.lvm.lv=&amp;lt;vg&amp;gt;&#x2F;&amp;lt;lv-holding-nix&amp;gt;&lt;&#x2F;code&gt; &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#11&quot;&gt;10&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Once you&#x27;ve done those, regenerate dracut &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#12&quot;&gt;11&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; as well as &lt;a href=&quot;https:&#x2F;&#x2F;fedoraproject.org&#x2F;wiki&#x2F;GRUB_2#Updating_the_GRUB_configuration_file&quot;&gt;grub&lt;&#x2F;a&gt;
or systemd-boot &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#13&quot;&gt;12&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;, then reboot.  You should fine that systemd &lt;a href=&quot;https:&#x2F;&#x2F;i.imgflip.com&#x2F;4wjeml.jpg&quot;&gt;&lt;del&gt;summons
the Nix demon&lt;&#x2F;del&gt;&lt;&#x2F;a&gt; starts nix-daemon automatically and you can run &lt;code&gt;nix run nixpkgs#hello&lt;&#x2F;code&gt; and &lt;code&gt;nix develop&lt;&#x2F;code&gt; to your heart&#x27;s content.&lt;&#x2F;p&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;or any other NixOS-loving entity, of any genders or none at all&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;2&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;2&lt;&#x2F;sup&gt;
&lt;p&gt;it&#x27;s important to speak like you&#x27;re in a 4-color comic at all times&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;3&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;3&lt;&#x2F;sup&gt;
&lt;p&gt;the kernel, of course, you need because you have made the Grave Mistake
™ of using a laptop with a discrete graphics card &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#14&quot;&gt;13&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;, which is made
by the the folks over at nvidia &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#15&quot;&gt;14&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;, and, having the &lt;em&gt;frankly absurd&lt;&#x2F;em&gt;
requirement of needing to use external monitors, so you&#x27;ll need
working nouveau for your system &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#16&quot;&gt;15&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;4&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;4&lt;&#x2F;sup&gt;
&lt;p&gt;with luks2 underneath your lvm pv, of course&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;5&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;5&lt;&#x2F;sup&gt;
&lt;p&gt;a traditional cause of much woe and teeth gnashing amongst linux folks&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;6&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;6&lt;&#x2F;sup&gt;
&lt;p&gt;and &lt;code&gt;&#x2F;etc&#x2F;fstab&lt;&#x2F;code&gt;, which turns into a &lt;a href=&quot;https:&#x2F;&#x2F;www.freedesktop.org&#x2F;software&#x2F;systemd&#x2F;man&#x2F;systemd-fstab-generator.html&quot;&gt;set of virutal units&lt;&#x2F;a&gt;, so that
systemd has a single source of what it&#x27;s supposed to do when&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;7&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;16&lt;&#x2F;sup&gt;
&lt;p&gt;yes, that&#x27;s the Gentoo wiki.  Still one of the best sources&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;8&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;7&lt;&#x2F;sup&gt;
&lt;p&gt;also, yes, half the stuff for Fedora is named after towns in MA.      It&#x27;s a thing&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;9&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;8&lt;&#x2F;sup&gt;
&lt;p&gt;specifically, partway-through-Dracut sooner.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;10&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;9&lt;&#x2F;sup&gt;
&lt;p&gt;normally, this is just the root and swap volumes,
like &lt;code&gt;rd.lvm.lv=primary&#x2F;root rd.lvm.lv=primary&#x2F;swap&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;11&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;10&lt;&#x2F;sup&gt;
&lt;p&gt;if your vg is named primary, and the lv is nix, you should end
up with a piece of  kernel command line that looks something like
&lt;code&gt;rd.lvm.lv=primary&#x2F;root rd.lvm.lv=primary&#x2F;swap    rd.lvm.lv=primary&#x2F;nix&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;12&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;11&lt;&#x2F;sup&gt;
&lt;p&gt;&lt;code&gt;dracut --regenerate-all --force&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;13&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;12&lt;&#x2F;sup&gt;
&lt;p&gt;&lt;code&gt;kernel-install&lt;&#x2F;code&gt; is a way do this, not sure if there&#x27;s a less cumbersome way&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;14&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;13&lt;&#x2F;sup&gt;
&lt;p&gt;first mistake&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;15&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;14&lt;&#x2F;sup&gt;
&lt;p&gt;second mistake&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;16&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;15&lt;&#x2F;sup&gt;
&lt;p&gt;&quot;why,&quot;, you might ask yourself, &quot;do I need working nouveau for external monitors?&quot;.
Well, self, laptop manufacturers hate you.  More specifically, they frequently wire
things up so that the integrated graphics drive the laptop monitor, and the discrete
graphics drive any and all external connections (HDMI, displayport, thunderbolt).&lt;&#x2F;p&gt;
  &lt;p&gt;
  &quot;That&#x27;s not so bad...&quot;, you might think.  &quot;Anyway, I can just use the [shiny new (kinda)
  open-source nvidia drivers][nvidia-oss]&quot; [^17] But! wait just a darned minute! there&#x27;s more!
  You see, self, nvidia often hates standards.  Specifically, the standards that a lot of
  the smaller wlroots-compositors [^18] use to draw things to the screen via wayland [^19].
  &lt;&#x2F;p&gt;
  &lt;p&gt;
  So, unless we want weird graphical artifacts, disappearing cursors, and [passive][sway-nv-1]-
  [agressive][sway-nv-2] command line flags, we&#x27;ll need nouveau, which actually works here,
  but only recent kernels and such support a bunch of the
  newer-ish graphics cards from the past couple years.
  &lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;17&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;17&lt;&#x2F;sup&gt;
&lt;p&gt;hey Fedora folks, did you finally have that &quot;nvidia open source driver release party&quot;?&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;18&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;18&lt;&#x2F;sup&gt;
&lt;p&gt;well, it&#x27;s not &lt;em&gt;entirely&lt;&#x2F;em&gt; nvidia&#x27;s fault, the wlroots folks are a bit curmudgeonly, too&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;19&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;19&lt;&#x2F;sup&gt;
&lt;p&gt;oh yeah, I forgot to mention, we&#x27;re using wayland&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Stories of My Friend M</title>
        <published>2022-03-29T00:00:00+00:00</published>
        <updated>2022-03-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://metamagical.dev/m-eulogy/"/>
        <id>https://metamagical.dev/m-eulogy/</id>
        
        <content type="html" xml:base="https://metamagical.dev/m-eulogy/">&lt;section class=&quot;warning&quot;&gt;
&lt;details&gt;
&lt;summary&gt;&lt;em&gt;&lt;strong&gt;CW&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;: Grief, Death &#x2F; Background&lt;&#x2F;summary&gt;
&lt;p&gt;One year ago today, one of my best and longest friends passed away suddenly.
This is a eulogy I never got to give.&lt;&#x2F;p&gt;
&lt;&#x2F;details&gt;
&lt;&#x2F;section&gt;
&lt;p&gt;We told stories, my friend &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt; and I.  All sorts of stories, over and over, for
almost 10 years: stories of fantastical places, stories of our lives, stories
about us telling stories, stories with friends.&lt;&#x2F;p&gt;
&lt;p&gt;There’s a saying we have in Judaism when someone has passed away: Zichrona
Livracha (זכרונה לברכה)&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.  It means &quot;may her memory be a blessing” – one of
the myriad forms of &quot;nobody is truly ever dead, as long as we keep telling
their stories”.  In that spirit, I’d like to tell you a bit about &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt;, tell you
pieces of her story, with some meandering miscellaneous lore along the way&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I don’t remember the exact moment I first met &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt;, but I can tell you for certain
it was at university, in one of two places: a Science Fiction Society (SFS)
meeting, or in the Octawedge.  The Octawedge was not, contrary to its name,
wedge-shaped – rather, it was an octagonal room in the campus center, a
replacement &quot;hanging out area” for SFS folks, the old &quot;wedge&quot;&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#3&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; having been
deprecated long since.  SFS folks would hang out there, clustered around
Rounds&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#4&quot;&gt;4&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; in large, comfy chairs by the fireplace, hacking on personal
projects, working on homework, debating sci-fi, telling stories, or generally
just being around each other.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt; was very active in the SFS – she was what one might call a classic High Nerd:
she could debate Tolkien at length, tell you all about her favorite classic
X-men comics.  She loved Inu-Yasha &amp;amp; The Last Unicorn, Elf Quest and fanfics,
Star Trek &amp;amp; the video game Pharaoh.  She could regale you with stories about
different types of LARPs, or modern, slightly tongue-in-cheek retellings of
Jewish myths.  She was also a rocket scientist&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#5&quot;&gt;5&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;, roboticist, and software
developer, as well as multi-time SFS officer&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#6&quot;&gt;6&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.  In addition to all that, she
was a wonderful friend, always ready with advice if I wanted it or ways to
cheer me up if I was down.&lt;&#x2F;p&gt;
&lt;p&gt;While I met &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt; via the SFS, I suspect the point at which we became fast friends
was via a tabletop RPG.  &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt;’s boyfriend (now husband), &lt;span class=&quot;fancy-name&quot;&gt;A&lt;&#x2F;span&gt;, and I had already been
in a different RPG together &amp;amp; knew each other from the SFS, and so when &lt;span class=&quot;fancy-name&quot;&gt;A&lt;&#x2F;span&gt;
decided to run a new Eberron-based DnD game, I signed up, along with our mutual
friend, &lt;span class=&quot;fancy-name&quot;&gt;D&lt;&#x2F;span&gt;.  From then on, I spent many a weeked at &lt;span class=&quot;fancy-name&quot;&gt;A&lt;&#x2F;span&gt; &amp;amp; &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt;’s apartment, eating
takeout&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#7&quot;&gt;7&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;, playing DnD, telling stories, and basking in the presence of &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt;’s
glorious cat, nicknamed The Floof&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#8&quot;&gt;8&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Life progressed after uni, but storytelling stayed constant – &lt;span class=&quot;fancy-name&quot;&gt;A&lt;&#x2F;span&gt; &amp;amp; &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt; got married
at an amazing Steampunk-themed wedding, and &lt;span class=&quot;fancy-name&quot;&gt;A&lt;&#x2F;span&gt;, &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt;, &lt;span class=&quot;fancy-name&quot;&gt;D&lt;&#x2F;span&gt;, &amp;amp; I played DnD afterwards
(&lt;span class=&quot;fancy-name&quot;&gt;A&lt;&#x2F;span&gt; &amp;amp; &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt; actually met in another game run by &lt;span class=&quot;fancy-name&quot;&gt;D&lt;&#x2F;span&gt;, and started dating in-game before
doing so IRL).  &lt;span class=&quot;fancy-name&quot;&gt;A&lt;&#x2F;span&gt; &amp;amp; &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt; lived pretty close to me, so I’d often spend weekends at
their apartment.  &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt; would give &lt;span class=&quot;fancy-name&quot;&gt;A&lt;&#x2F;span&gt; &amp;amp; me little grocery &quot;quests”, with silly
doodles &amp;amp; puns as &quot;quest rewards”.  We’d go out to eat or cook&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#9&quot;&gt;9&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; in&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#10&quot;&gt;10&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;,
play games, watch movies, and debate all sorts of things&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#11&quot;&gt;11&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;And, of course, we continued to tell stories: &lt;span class=&quot;fancy-name&quot;&gt;A&lt;&#x2F;span&gt;’s &amp;amp; &lt;span class=&quot;fancy-name&quot;&gt;D&lt;&#x2F;span&gt;’s games both continued,
and we added a Shadowrun game run by &lt;span class=&quot;fancy-name&quot;&gt;A&lt;&#x2F;span&gt; &amp;amp; &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt; to the mix to fill spaces between
the others.  Even when I moved to CA, we continued to tell our stories online,
and I’d occasionally fly back and crash at their apartment for a week, working
during the week and then having a marathon game session all weekend.&lt;&#x2F;p&gt;
&lt;p&gt;I’d like to say we got to see how the grand, sprawling epic fantasy story that
&lt;span class=&quot;fancy-name&quot;&gt;A&lt;&#x2F;span&gt; wrote ended, to say that our characters retired happily in Shadowrun, having
worked out all their mysterious pasts and life goals, I’d like to say that &lt;span class=&quot;fancy-name&quot;&gt;A&lt;&#x2F;span&gt; &amp;amp;
&lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt; finished saving the world from the consequences of saving the world the last
time in &lt;span class=&quot;fancy-name&quot;&gt;D&lt;&#x2F;span&gt;’s game.  But those of you who play know: runners rarely get to ever
retire, not every hero makes it through the final confrontation with the BBEG
alive, and, unfortunately, sometimes players suddenly have their stories cut
short.  One year ago today, &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt; passed away, suddenly, in the middle of the
night.&lt;&#x2F;p&gt;
&lt;p&gt;There’s so many more stories I could tell you about &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt;: about how she hated
spoilers with the fiery passion of a thousand suns; about how she earned her
SFS officer nickname of God Shampoo; about how, after getting her US
citizenship, she wanted to celebrate the most ridiculously stereotypically
American way she could think of: eating burgers &amp;amp; going shooting.  I could tell
about the times she &amp;amp; &lt;span class=&quot;fancy-name&quot;&gt;A&lt;&#x2F;span&gt; dropped everything and drove 40 minutes to take me out
to dinner when I had a rough day.  Alas, there’s only so many places to stick
anecdotes in a blog post before it becomes oversaturated.&lt;&#x2F;p&gt;
&lt;p&gt;All those stories, however, all the stories we shared, live on, whether they be
epic game moments, goofy IRL stories, or any other myriad of wonderful times.
When I think back on those stories, I smile; when our friend group regale each
other with the stories, we laugh.  And in this I think, I can say, for certain:
to me, &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt;’s memory is a blessing.&lt;&#x2F;p&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;often just z”l or ז״ל&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;2&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;2&lt;&#x2F;sup&gt;
&lt;p&gt;one of the things &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt; could discuss at length was Tolkien, so I’m sure the
meandering lore would be fine 😉&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;3&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;3&lt;&#x2F;sup&gt;
&lt;p&gt;which was, in fact, wedge-shaped&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;4&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;4&lt;&#x2F;sup&gt;
&lt;p&gt;varying-sized odd cylindrical tables&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;5&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;5&lt;&#x2F;sup&gt;
&lt;p&gt;I mean this somewhat literally: she studied aeronautics, and eventually
got a PhD in it&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;6&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;6&lt;&#x2F;sup&gt;
&lt;p&gt; As you might ascertain by that list, &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt; had an aura of Getting Shit Done.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;7&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;7&lt;&#x2F;sup&gt;
&lt;p&gt; this was how I discovered that Indian food was, in fact, delicious&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;8&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;8&lt;&#x2F;sup&gt;
&lt;p&gt;The Floof was also known as Chicha (formal), The Cheech (semi formal),
and a myriad of other appellations.  She was a beautiful long haired ragdoll
with zero sense of depth.  At one apartment, she would run in circles around
us while we played &amp;amp; then shoot off down a hallway like a particle
accelerator, only to be stopped by an unfortunately placed door.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;9&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;9&lt;&#x2F;sup&gt;
&lt;p&gt;&lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt; loved my beer Mac and Cheese recipe, so it was not uncommon for it to
Be Declared that we were having mac &amp;amp; cheese when &lt;span class=&quot;fancy-name&quot;&gt;A&lt;&#x2F;span&gt; came to pick me up&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;10&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;10&lt;&#x2F;sup&gt;
&lt;p&gt; Once, &lt;span class=&quot;fancy-name&quot;&gt;A&lt;&#x2F;span&gt; &amp;amp; I covered their kitchen with drying pasta.  &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt; got home,
sighed, shook her head, and then rounded us up to go out for dinner&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;11&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;11&lt;&#x2F;sup&gt;
&lt;p&gt; &lt;span class=&quot;fancy-name&quot;&gt;M&lt;&#x2F;span&gt; was also Jewish, so we did a good deal of Jewish arguing, which drove
&lt;span class=&quot;fancy-name&quot;&gt;A&lt;&#x2F;span&gt; nuts.  He eventually learned to appreciate Jewish arguing… like 2 years
ago.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>So long, Kubernetes</title>
        <published>2021-06-14T00:00:00+00:00</published>
        <updated>2021-06-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://metamagical.dev/goodbye-kubernetes/"/>
        <id>https://metamagical.dev/goodbye-kubernetes/</id>
        
        <content type="html" xml:base="https://metamagical.dev/goodbye-kubernetes/">&lt;aside class=&quot;tldr&quot; aria-label=&quot;tl dr&quot;&gt;
&lt;h1 id=&quot;tl-dr&quot;&gt;TL;DR:&lt;&#x2F;h1&gt;
&lt;p&gt;It&#x27;s been an awesome six years, but it&#x27;s time for me to move on from
Kubernetes.&lt;&#x2F;p&gt;
&lt;&#x2F;aside&gt;
&lt;p&gt;My very first PR to Kubernetes, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;kubernetes&#x2F;kubernetes&#x2F;pull&#x2F;11599&quot;&gt;#11599&lt;&#x2F;a&gt;, was filed on July
20th, 2015, right in the middle of the 1.2 release cycle.&lt;&#x2F;p&gt;
&lt;p&gt;Design review, at the time, was Clayton &amp;amp; Tim &amp;amp; Brian debating
in the comments of my PR.  Godeps reigned supreme, staging didn&#x27;t exist,
and shared informers were but a twinkle in eye of the folks that worked on
that kind of thing.&lt;&#x2F;p&gt;
&lt;p&gt;My first KubeCon, in 2016, was on a floor or two of the hotel in Seattle
that&#x27;s attached to the convention center &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Six years (20 releases!) later, Kubernetes has come a long way.  We&#x27;ve got
design proposals, multiple repos, SIGs, and machinery galore. KubeCon
fills entire convention centers instead of just hotel floors &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; and
takes place across multiple continents.&lt;&#x2F;p&gt;
&lt;p&gt;Over those years, I&#x27;ve had the privilege of working across several
different parts of the Kubernetes codebase, from dabbling in Node to
leading SIG autoscaling to co-creating &amp;amp; leading KubeBuilder. I&#x27;ve worked
with some amazing people, and made some wonderful friends.&lt;&#x2F;p&gt;
&lt;p&gt;But, all things must eventually come to an end.  This week (up through
2021&#x2F;06&#x2F;18) will be my last working on Kubernetes.  The KubeBuilder
project is in good hands with my fellow maintainers, and I look forward to
seeing what cool stuff comes next for Kubernetes, from the outside in this
time.&lt;&#x2F;p&gt;
&lt;p&gt;In general, I probably won&#x27;t be around on the Kubernetes Slack, so if you
need to get in touch, feel free to use my work email or the email on my
GitHub account, or Twitter DMs for personal stuff.&lt;&#x2F;p&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;To this day, that KubeCon still has one of my favorite
&lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=7g4da6-JXfE&quot;&gt;keynotes&lt;&#x2F;a&gt;: at a time when people weren&#x27;t really
extending Kubernetes a ton, Comcast was using TPRs (not even CRDs yet!)
to manage going from video-over-IP to video-over-cable.  This kinda
foreshadowed all the cool stuff that people would do with CRDs a couple
of years later.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;2&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;2&lt;&#x2F;sup&gt;
&lt;p&gt;in fact, we ended up coming back to Seattle in 2018, except that
time we filled the entire convention center! 😲&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
</feed>
